繁体   English   中英

Haskell Monad 定律是如何从 Monoid 定律推导出来的?

[英]How are Haskell Monad laws derived from Monoid laws?

内函子范畴中幺半群的定律是:

幺半群定律

Haskell monad 法则是:

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

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

结合性: m >>= (\\x -> kx >>= h) = (m >>= k) >>= h

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

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

这些如何等同于 Haskell monad 定律?

为了从join -monad 定律中显示>>= -monad 定律,需要根据乘法 ( join )、统一性 ( return ) 和函式 ( fmap ) 定义x >>= y ,所以我们需要让,根据定义,

(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 fmap_T k . return = return . fmap_I k = return . k 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法则、自然性、功能性)。

用 Kleisli 组合运算符(>=>)表述monad 定律。

假设k :: a -> mb , k' :: b -> mc , k'' :: c -> md (即k , k' , k''是 Kleisli 箭头)

  • 左身份: return >=> k = k
  • 正确的身份: k >=> return = k
  • 结合性: (k >=> k') >=> k'' = k >=> (k' >=> k'')

(>=>)的定义中可以相对简单地表明这些与您编写的内容相同。 而且您不需要任何花哨的图表或任何东西:这些实际上就是幺半群定律,以return作为身份, (>=>)作为您的幺半群运算。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM