Monad
是一个幺半群,然而它的绰号与{Integer
不同。我想知道是否有办法编写Monoid'
和Monad'
,以便Integer
和Monad'
都可以表示为同一Monoid'
类型类的实例?< / p>
答案 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显示了如何使用类型多态在同一类型类下统一Monad
和Monoid
。这与Tel的答案略有不同,因为monad在endofunctors类别中被实现为monoid,而不是Kleisli类别中的monoid。