(m >>= f) >>= g
= m >>= (\x -> f x >>= g)
f
和有什么不同\x->f x
??
我认为它们是同一类型a -> m b
。但似乎>>=
等式右侧的第二个将类型\x->f x
视为 as m b
。怎么了?
(m >>= f) >>= g
= m >>= (\x -> f x >>= g)
f
和有什么不同\x->f x
??
我认为它们是同一类型a -> m b
。但似乎>>=
等式右侧的第二个将类型\x->f x
视为 as m b
。怎么了?
在大多数情况下,表达式f
和\x -> f x
do 的含义相同。但是,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
不同之处仅在于执行加法的顺序。
单子定律要求,就像加法一样,两者的答案应该是相同的。