【问题标题】:instance Monoid Monad实例 Monoid Monad
【发布时间】:2019-07-15 21:47:35
【问题描述】:

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

【问题讨论】:

  • 我想你想阅读this blog post 解释如何使用种类多态性将两者统一在同一类型类下。
  • @GabrielGonzalez:你能把它变成答案吗?它实际上回答了我理解的问题,与当前的答案不同。

标签: haskell monads


【解决方案1】:

所以,让我们选择一个特定的方式 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 是内函子范畴中的幺半群”。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我已将链接更改为指向 Wayback Machine,但如果您在此处的答案中总结 Jon 的博客文章会更好,这样它才能继续存在。
    猜你喜欢
    • 1970-01-01
    • 2017-02-18
    • 2012-04-02
    • 1970-01-01
    • 2013-03-21
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    相关资源
    最近更新 更多