Экземпляр Monoid Monad

Monad - моноид, однако он моноид по-другому, чем, скажем, Integer. Интересно, существует ли способ написать Monoid' и Monad' так, что как Integer, так и Monad' могут быть выражены как экземпляры одного и того же Monoid' typeclass?

Ответ 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

Я не уверен, как выразить формулировку "Монада - моноида в категории эндофенторов" в Хаскелле, однако.