(m >>= f) >>= g
= m >>= (\x -> f x >>= g)
与f
和\x->f x
??
我认为它们属于同一类型a -> m b
。但似乎等式右边的第二个>>=
将\x->f x
的类型视为m b
。
出了什么问题?
答案 0 :(得分:15)
表达式f
和\x -> f x
对于大多数用途来说意味着同样的事情。但是,lambda表达式的范围尽可能向右延伸,即m >>= (\x -> (f x >>= g))
。
如果类型为m :: m a
,f :: a -> m b
和g :: b -> m c
,则左侧为(m >>= f) :: m b
,右侧为(\x -> f x >>= g) :: a -> m c
。
因此,两个表达式之间的差异就是执行(>>=)
个操作的顺序,就像表达式1 + (2 + 3)
和(1 + 2) + 3
的不同之处仅在于添加的顺序进行。
monad法律规定,与添加一样,两者的答案应该相同。