Это не монада, но что это?

Согласно 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