例如Monoid Monad

时间:2013-06-20 04:45:49

标签: haskell monads

Monad是一个幺半群,然而它的绰号与{Integer不同。我想知道是否有办法编写Monoid'Monad',以便IntegerMonad'都可以表示为同一Monoid'类型类的实例?< / p>

2 个答案:

答案 0 :(得分:7)

所以,让我们选择一种特定的方式Integer有一个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

然而,我不确定如何在Haskell中表达“Monad在endofunctors类别中的幺半群”的表达方式。

答案 1 :(得分:4)

我正在根据Tikhon的要求将我的评论转为答案。 This blog post显示了如何使用类型多态在同一类型类下统一MonadMonoid。这与Tel的答案略有不同,因为monad在endofunctors类别中被实现为monoid,而不是Kleisli类别中的monoid。