Выражения f
и \x -> f x
в большинстве случаев означают одно и то же. Однако область действия лямбда-выражения распространяется как можно дальше вправо, то есть 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
отличаются только в том порядке, в котором выполняются добавления.
Законы монады требуют, чтобы, как и сложение, ответ был одинаковым для обоих.