Monad在haskell中的关联性规则

时间:2011-12-01 20:43:19

标签: haskell monads associativity

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

f\x->f x ??

有什么不同

我认为它们属于同一类型a -> m b。但似乎等式右边的第二个>>=\x->f x的类型视为m b。 出了什么问题?

1 个答案:

答案 0 :(得分:15)

表达式f\x -> f x对于大多数用途来说意味着同样的事情。但是,lambda表达式的范围尽可能向右延伸,即m >>= (\x -> (f x >>= g))

如果类型为m :: m af :: a -> m bg :: b -> m c,则左侧为(m >>= f) :: m b,右侧为(\x -> f x >>= g) :: a -> m c

因此,两个表达式之间的差异就是执行(>>=)个操作的顺序,就像表达式1 + (2 + 3)(1 + 2) + 3的不同之处仅在于添加的顺序进行。

monad法律规定,与添加一样,两者的答案应该相同。