, что в действительности является результатом всего выражения.
Поэтому неважно, как у вас вложена передача значений монадическим функциям. Важен их смысл. Давайте рассмотрим ещё один способ реализации этого закона. Предположим, мы производим композицию двух функций, >f
и >g
:
>(.) :: (b –> c) –> (a –> b) –> (a –> c)
>f . g = (\x –> f (g x))
Если функция >g
имеет тип >a –> b
и функция >f
имеет тип >b –> c
, мы компонуем их в новую функцию типа >a –> c
, чтобы её параметр передавался между этими функциями. А что если эти две функции – монадические? Что если возвращаемые ими значения были бы монадическими? Если бы у нас была функция типа >a –> m b
, мы не могли бы просто передать её результат функции типа >b –> m c
, потому что эта функция принимает обычное значение >b
, не монадическое. Чтобы всё-таки достичь нашей цели, можно воспользоваться операцией ><=<
:
>(<=<) :: (Monad m) => (b –> m c) –> (a –> m b) –> (a –> m c)
>f <=< g = (\x –> g x >>= f)
Поэтому теперь мы можем производить композицию двух монадических функций:
>ghci> let f x = [x,-x]
>ghci> let g x = [x*3,x*2]
>ghci> let h = f <=< g
>ghci> h 3
>[9,-9,6,-6]
Ладно, всё это здорово. Но какое это имеет отношение к закону ассоциативности? Просто, когда мы рассматриваем этот закон как закон композиций, он утверждает, что >f <=< (g <=< h)
должно быть равнозначно >(f <=< g) <=< h
. Это всего лишь ещё один способ доказать, что для монад вложенность операций не должна иметь значения.
Если мы преобразуем первые два закона так, чтобы они использовали операцию ><=<
, то закон левого тождества утверждает, что для каждой монадической функции >f
выражение >f <=< return
означает то же самое, что просто вызвать >f
. Закон правого тождества говорит, что выражение >return <=< f
также ничем не отличается от простого вызова >f
. Это подобно тому, как если бы >f
являлась обычной функцией, и тогда >(f . g) . h
было бы аналогично >f . (g . h)
, выражение >f . id
– всегда аналогично >f
, и выражение >id
>.
>f
тоже ничем не отличалось бы от вызова >f
.
В этой главе мы в общих чертах ознакомились с монадами и изучили, как работают монада >Maybe
и списковая монада. В следующей главе мы рассмотрим целую кучу других крутых монад, а также создадим нашу собственную.