Это не монада, но что это?
Согласно Haskell wikibook, Monad
называется m
является Functor
с двумя дополнительными операциями:
unit :: a -> m a
join :: m (m a) -> m a
Это хорошо, но у меня есть что-то немного другое. Глядя на детали gory, у меня есть тип, который имеет хорошие функции unit
и join
, но его fmap
не очень хорошо себя ведет (fmap g . fmap f
не обязательно fmap (g.f)
). Из-за этого его нельзя сделать экземпляром Monad
. Тем не менее, я хотел бы предоставить ему как можно больше общих функций.
Итак, мой вопрос: какие теоретические структуры категорий похожи на монады, поскольку они имеют unit
и join
?
Я понимаю, что на некотором уровне вышеупомянутый вопрос не определен. Для монад определения unit
и join
имеют смысл только в терминах определения fmap
. Без fmap
вы не можете определить какое-либо из законов монады, поэтому любые определения unit
/join
будут одинаково "действительными". Поэтому я ищу функции, отличные от fmap
, чтобы иметь смысл определять некоторые "немонадные" законы для этих функций unit
и join
.
Ответы
Ответ 1
Ну вот один закон, который вы должны иметь только с unit
и join
. Учитывая x :: m a
,
join (unit x) = x
Чтобы показать, что это произошло не из ниоткуда, давайте начнем с существующего закона монады:
return x >>= f = f x
Учитывая, что m >>= f = join (fmap f m)
join (fmap f (return x)) = f x
Выберите f = id
join (fmap id (return x)) = id x
Используйте закон функтора, который fmap id = id
join (id (return x)) = id x
Используйте очевидный id a = a
join (return x) = x