例如Monoid Monad

Kar*_*elė 10 monads haskell

Monad是一个幺半群,但它是一个不同于它的幺半群Integer.我不知道是否有写的方式Monoid',并Monad'使得这两个IntegerMonad'可表示为相同的实例Monoid'的类型类?

J. *_*son 7

所以,让我们选择一个特定的方式IntegerMonoid

instance Monoid Int where
  zero = 0
  plus = (+)
Run Code Online (Sandbox Code Playgroud)

现在这是一个 Monad Monoid

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

而这是另一个

instance MonadPlus m => Monoid (m a) where
  zero = mzero
  plus = mplus
Run Code Online (Sandbox Code Playgroud)

然而,我不确定如何在Haskell中表达"Monad是endofunctors类别中的monoid".


Gab*_*lez 3

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