9

(m >>= f) >>= g = m >>= (\x -> f x >>= g)

f和有什么不同\x->f x??

我认为它们是同一类型a -> m b。但似乎>>=等式右侧的第二个将类型\x->f x视为 as m b。怎么了?

4

1 回答 1

15

在大多数情况下,表达式f\x -> f xdo 的含义相同。但是,lambda 表达式的范围尽可能向右延伸,即m >>= (\x -> (f x >>= g)).

如果类型是m :: m a,f :: a -> m bg :: b -> m c, 那么左边有(m >>= f) :: m b, 右边有(\x -> f x >>= g) :: a -> m c

因此,这两个表达式之间的区别只是(>>=)执行操作的顺序,就像表达式一样1 + (2 + 3)(1 + 2) + 3不同之处仅在于执行加法的顺序。

单子定律要求,就像加法一样,两者的答案应该是相同的。

于 2011-12-01T20:50:11.523 回答