[英]Monad's associativity rule in haskell
(m >>= f) >>= g
= m >>= (\\x -> fx >>= g)
有什么不同于f
和\\x->fx
??
我认为它们的类型相同a -> mb
。 但似乎等式右边的第二个>>=
将\\x->fx
的类型视为mb
。 出了什么问题?
对于大多数目的,表达式f
和\\x -> fx
意思相同。 但是,lambda表达式的范围尽可能向右延伸,即m >>= (\\x -> (fx >>= g))
。
如果类型是m :: ma
, f :: a -> mb
,并且g :: b -> mc
,那么在左边我们有(m >>= f) :: mb
,在右边我们有(\\x -> fx >>= g) :: a -> mc
。
因此,两个表达式之间的差异就是执行(>>=)
操作的顺序,就像表达式1 + (2 + 3)
和(1 + 2) + 3
仅在添加顺序上不同执行。
monad法律要求,与添加一样,两者的答案应该相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.