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法律要求,与添加一样,两者的答案应该相同.
归档时间: |
|
查看次数: |
512 次 |
最近记录: |