10

Monad是一个幺半群,但是它是一个与说不同的幺半群Integer。我想知道是否有一种方法可以编写,并且Monoid'可以将Monad'两者都表示为同一类型类的实例?IntegerMonad'Monoid'

4

2 回答 2

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 是内函子类别中的幺半群”公式。

于 2013-06-20T05:22:16.960 回答
4

应 Tikhon 的要求,我将我的评论变成了答案。 这篇博文展示了如何使用种类多态性来统一MonadMonoid在同一个类型类下。这与 Tel 的回答略有不同,因为 monad 是作为内函子类别中的幺半群实现的,而不是 Kleisli 类别中的幺半群。

于 2013-06-20T15:20:21.900 回答