内仿函数类别中幺半群的定律是:
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 法则?
最佳答案
要从 join
-monad 法则中显示 >>=
-monad 法则,需要在中定义 x >>= y
乘法 (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 .返回=返回。 fmap_I k = 返回。 k
。我们将法律简化为:
join (return (k a)) = k a
这遵循 join
法则。
权利同一律
权利同一律
m >>= return = m
根据 >>=
的定义减少到:
join (fmap return m) = m
这正是 join
法则之一。
结合律留给你来证明。它应该遵循使用相同的工具(join
法则、自然性、仿函数性)。
关于haskell - Haskell Monad 法则如何从 Monoid 法则推导出来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69668056/