Monad
- моноид, однако он моноид по-другому, чем, скажем, Integer
. Интересно, существует ли способ написать Monoid'
и Monad'
так, что как Integer
, так и Monad'
могут быть выражены как экземпляры одного и того же Monoid'
typeclass?
Экземпляр Monoid Monad
Ответ 1
Я превращаю свой комментарий в ответ по просьбе Тихона. В этой записи блога показано, как объединить Monad
и Monoid
в одном классе типов, используя полиморфизм вида. Это немного отличается от ответа Тел в том, что монада реализована в виде моноида в категории эндофункторов, а не моноида в категории Клейсли.
Ответ 2
Итак, пусть выбрать конкретный путь Integer
имеет a Monoid
instance Monoid Int where
zero = 0
plus = (+)
и теперь здесь Monad
Monoid
{-# LANGUAGE FlexibleInstances #-}
instance Monad m => Monoid (Kleisli m a a) where
zero = id
plus = (.)
а здесь другой
instance MonadPlus m => Monoid (m a) where
zero = mzero
plus = mplus
Я не уверен, как выразить формулировку "Монада - моноида в категории эндофенторов" в Хаскелле, однако.