Правило ассоциативности Монады в хаскеле - PullRequest
9 голосов
/ 02 декабря 2011

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

что отличается от f и \x->f x ??

Я думаю, что они одного типа a -> m b. но кажется, что вторая >>= в правой части уравнения рассматривает тип \x->f x как m b. что не так?

1 Ответ

15 голосов
/ 02 декабря 2011

Выражения 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 отличаются только в том порядке, в котором выполняются добавления.

Законы монады требуют, чтобы, как и сложение, ответ был одинаковым для обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...