Haskell Monad 法则如何从 Monoid 法则推导出来?

How are Haskell Monad laws derived from Monoid laws?

内函子类别中幺半群的定律是:

Haskell monad 定律是:

左身份:return a >>= k = k a

正确身份:m >>= return = m

关联性:m >>= (\x -> k x >>= h) = (m >>= k) >>= h

我假设后者是从前者派生出来的,但怎么会这样呢?图表基本上说

join (join x) = join (fmap join x)
join (return x) = x
join (fmap return x) = x

这些如何等同于 Haskell monad 法则?

the Kleisli composition operator (>=>).

来表述单子法则

假设k :: a -> m bk' :: b -> m ck'' :: c -> m d(即kk'k''是克莱斯利箭头)

  • 左身份:return >=> k = k
  • 正确身份:k >=> return = k
  • 关联性:(k >=> k') >=> k'' = k >=> (k' >=> k'')

(>=>)的定义可以比较直接的看出这些和你写的是等价的。而且你不需要任何花哨的图表或任何东西:这些是字面意思幺半群法则,return作为标识,(>=>)作为你的幺半群操作。

您在图片中显示的图表是对 monad 的另一种思考方式。您可以根据自然变换(即 joinreturn)或组合(即 return(>>=) / (>=>))等效地定义 monad。后一种方法适用于您正在寻找的幺半群思维方式。

为了从 join-monad 法则中显示 >>=-monad 法则,需要根据乘法 (join)、单位 ( return) 和函子性 (fmap),所以根据定义,我们需要让

(x >>= y) = join (fmap y x)

左恒等式

左恒等式则变为

return a >>= k = k a

根据>>=的定义,相当于

join (fmap k (return a)) = k a

现在,return 是一个自然变换 I -> T(其中 I 是恒等函子),所以 fmap_T k . return = return . fmap_I k = return . k。我们将定律简化为:

join (return (k a)) = k a

这遵循 join 法律。

对等式法

正确的身份法则

m >>= return = m

根据 >>= 的定义减少到:

join (fmap return m) = m

这正是 join 法则之一。

结合律留给你证明。它应该遵循使用相同的工具(join 法则、自然性、函数性)。