Для разных возможных экземпляров Monad типа подразумевается, что экземпляр Functor всегда одинаковый?
В соответствии с Typeclassopedia и эта ссылка тип может иметь только один экземпляр Functor
(там есть доказательство в ссылке). Но я понимаю, что для данного типа возможно наличие нескольких возможных экземпляров Monad
, верно ли это? Но для данного экземпляра Monad
существует бесплатный экземпляр Functor
с
fmap f xs = xs >>= return . f
Из этого я заключаю, что если я наткнулся на тип, в котором я могу определить несколько экземпляров Monad
по-разному, то функция fmap
, полученная как указано выше, должна быть равна для всех из них, другими словами, если У меня две пары функций:
bind_1 :: m a -> (a -> m b) -> m b
unit_1 :: a -> m a
bind_2 :: m a -> (a -> m b) -> m b
unit_2 :: a -> m a
для конструктора того же типа m
, что, обязательно:
xs `bind_1` (unit_1 . f) == xs `bind_2` (unit_2 . f)
для всех xs :: a
и f :: a -> b
.
Это правда? Означает ли это, что это теорема?
Ответы
Ответ 1
Да. На самом деле мы можем сделать более сильное утверждение о том, что все функции с типом
fmap :: (a -> b) -> (F a -> F b)
такие, что fmap id = id
эквивалентны. Это фактически просто выпадает из типа fmap
с чем-то, называемым параметричностью.
В вашем случае, если >>=
и return
удовлетворяют законам монады, то
mFmap f a = a >>= return . f
mFmap id a = a >>= return . id
mFmap id a = a >>= return
mFmap id a = a
mFmap id = id
В соответствии с законом монады a >>= return
справедливо a
. Используя этот результат, мы можем обратиться к свободной теореме, полученной из параметричности, и имеем наше доказательство.