Правило ассоциативности Монады в Хаскелле
-
27-10-2019 - |
Вопрос
(m >>= f) >>= g
= m >>= (\x -> f x >>= g)
Что отличается от f
а также \x->f x
??
Я думаю, что они одинаковы a -> m b
. Анкет Но кажется, что второй >>=
в правой стороне уравнения относится к типу \x->f x
в качестве m b
Анкет Что идет не так?
Решение
Выражения 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
отличается только в том порядке, в котором выполняются дополнения.
Законы Монады требуют, чтобы, как и в дополнение, ответ должен был быть одинаковым для обоих.