При решении одной задачки возникло такое предположение, и частично я вроде даже провел некоторые правдоподобные рассуждения, чтобы попытаться его доказать. Собственно, утверждение:
Мы имеем некоторый моноид. Применяем к нему аппликативный функтор. Получаем структуру, которая предположительно также является моноидом, с нейтральным элементом - нейтральным элементом исходного моноида при применении к нему этого функтора, и бинарной операцией - операцией исходного моноида, погруженной в контекст этого функтора, то есть:
1) mempty' = pure mempty
2) mappend' a b = fmap mappend a <*> b (или mappend' = liftA2 mappend)
Таким образом можно неограниченно оборачивать моноиды в любое количество любых аппликативных функторов, сохраняя моноидальность результата. Я попробовал доказать выполнение условий левой и правой единиц образованного таким образом моноида, ассоциативность бинарной операции пока не осилил. Выкладки (после знаков равенства записаны номера тождеств, которые применялись при преобразованиях, тождества выписаны не все, а только которые потребовались для доказательства):
Моноид:
m1) mappend mempty = id
Функтор:
f1) fmap id = id
f2) fmap (f . g) = fmap f . fmap g
Аппликативный функтор:
a1) pure f <*> pure x = pure (f x)
a2) u <*> pure y = pure ($ y) <*> u
a3) pure f <*> x = fmap f x
Новый моноид:
1) mempty' = pure mempty
2) mappend' a b = fmap mappend a <*> b (mappend' = liftA2 mappend)
Левая единица:
mappend' mempty' x = (1,2)
fmap mappend (pure mempty) <*> x = (a3)
(pure mappend) <*> (pure mempty) <*> x = (a1)
pure (mappend mempty) <*> x = (a3)
fmap (mappend mempty) x = (m1)
fmap id x = (f1)
x
Правая единица:
mappend' x mempty' = (1,2)
fmap mappend x <*> (pure mempty) = (a2)
pure ($ mempty) <*> (fmap mappend x) = (a3)
fmap ($ mempty) (fmap mappend x) = (f2)
fmap ($ mempty . mappend) x =
fmap (mappend mempty) x = (m1)
fmap id x = (f1)
x
Собственно, у меня несколько вопросов:
1) Не ошибся ли я в своих выкладках?
2) Натолкнёте на идею доказательства/опровержения последнего закона моноида - ассоциативности новой бинарной операции?
3) Справедливо ли вообще мое предположение о том, что это моноид?
ЗЫ пишу в этот раздел, т.к. вопрос теоретический, а не практического программирования.