sno*_*now 9 monads haskell associativity
(m >>= f) >>= g = m >>= (\x -> f x >>= g)
有什么不同f和\x->f x?
我认为它们属于同一类型a -> m b.但似乎>>=等式右边的第二个对象的类型\x->f x为m b.出了什么问题?
C. *_*ann 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法律要求,与添加一样,两者的答案应该相同.