实例 压合(Monoid)单子(Monad)

9

Monad 是一个单子,但它与例如 Integer 不同的是以不同的方式成为了单子。我想知道是否有一种方法可以编写 Monoid'Monad',使得 IntegerMonad' 都可以表示为相同的 Monoid' 类型类的实例?


6
我认为你想阅读这篇博客文章,它解释了如何使用种类多态性将“单子”和“幺半群”统一到同一个类型类下。 - Gabriella Gonzalez
1
@GabrielGonzalez:你能把那转化成一个答案吗?就我理解的问题,它实际上回答了这个问题,不像当前的回答。 - Tikhon Jelvis
2个回答

6
因此,让我们选择一种特定的方式,使Integer成为一个Monoid
instance Monoid Int where
  zero = 0
  plus = (+)

现在介绍一下 MonadMonoid

{-# LANGUAGE FlexibleInstances #-}
instance Monad m => Monoid (Kleisli m a a) where
  zero = id
  plus = (.)

and here's another

instance MonadPlus m => Monoid (m a) where
  zero = mzero
  plus = mplus

我不确定如何在Haskell中直接表达“Monad是函子范畴中的幺半群”这个概念。


3
我根据Tikhon的要求将我的评论转化为回答。 这篇博客文章展示了如何使用类型多态性将Monad和Monoid统一到同一个类型类中。这与Tel的答案略有不同,因为Monad是在自函子范畴中实现为一个幺半群,而不是在Kleisli范畴中实现为一个幺半群。请参考此博客文章

我已将链接更改为指向Wayback Machine,但最好在此回答中总结Jon的博客文章,以便它能够保存下来。 - Cactus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接