This question already has answers here:
Why MonadPlus and not Monad + Monoid?
(3个答案)
5年前关闭。
我对
现在,我们应用此定律来推断
(在这里我们选择
如果我们将
MonadPlus和monoid
注意
因此,
(3个答案)
5年前关闭。
我对
Monads
和Monoids
都很陌生,最近还了解了MonadPlus
。从我看来,Monoid
和MonadPlus
都提供了具有关联二进制运算和标识的类型。 (在数学上,我将其称为半群。)那么Monoid
和MonadPlus
有什么区别? 最佳答案
semigroup是配备有关联二进制运算的结构。 monoid是带有标识元素的半组,用于二进制操作。
单声道和半群
每个monad必须遵守the monad laws。对于我们而言,重要的是关联律。用>>=
表示:
(m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)
现在,我们应用此定律来推断
>> :: m a -> m b -> m b
的关联性:(m >> n) >> p ≡ (m >>= \_ -> n) >>= \_ -> p
≡ m >>= (\x -> (\_ -> n) x >>= \_ -> p)
≡ m >>= (\x -> n >>= \_ -> p)
≡ m >>= (\x -> n >> p)
≡ m >> (n >> p)
(在这里我们选择
x
,以便它不会出现在m
,n
或p
中)。如果我们将
>>
专门化为m a -> m a -> m a
类型(用b
代替a
),我们会看到对于任何类型a
而言,>>
操作在m a
上形成了一个半群。 既然对于任何a
都是如此,我们得到了一个由a
索引的半群类。但是,它们通常不是monoid的-我们没有>>
的标识元素。MonadPlus和monoid
MonadPlus
添加了另外两个操作,mplus
和mzero
。 MonadPlus
laws明确声明mplus
和mzero
必须在m a
上对任意a
形成一个monoid。再一次,我们得到一类由a
索引的monoid。注意
MonadPlus
和Monoid
之间的区别:Monoid
说某种单一类型满足单调规则,而MonadPlus
说对于所有可能的a
,m a
类型都满足单调律。这是一个更强的条件。因此,
MonadPlus
实例形成了两种不同的代数结构:一类是>>
的半群,另一类是mplus
和mzero
的monoid。 (这并不罕见,例如,大于零的自然数集合{1,2,...}
与+
组成一个半群,而与×
和1
组成一个monoid。)关于haskell - Monoid vs MonadPlus ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17056881/
10-13 06:04