[英]How are Haskell Monad laws derived from Monoid laws?
为了从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 的另一种思考方式。 您可以根据自然转换(即join
和return
)或组合(即return
和(>>=)
/ (>=>)
)等价地定义 monad。 后一种方法适用于您正在寻找的幺半群思维方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.