>Nothing
Как бы это выглядело, если бы мы не сделали разумный выбор, обработав значения типа >Maybe
как значения с контекстом неудачи и передав их функциям? Вот какой была бы последовательность приземлений птиц:
>routine :: Maybe Pole
>routine = case landLeft 1 (0, 0) of
> Nothing –> Nothing
> Just pole1 –> case landRight 4 pole1 of
> Nothing –> Nothing
> Just pole2 –> case landLeft 2 pole2 of
> Nothing –> Nothing
> Just pole3 –> landLeft 1 pole3
Мы усаживаем птицу слева, а затем проверяем вероятность неудачи и вероятность успеха. В случае неудачи мы возвращаем значение >Nothing
. В случае успеха усаживаем птиц справа, а затем повторяем всё сызнова. Превращение этого убожества в симпатичную цепочку монадических применений с использованием функции >>>=
является классическим примером того, как монада >Maybe
экономит массу времени, когда вам необходимо последовательно выполнить вычисления, основанные на вычислениях, которые могли окончиться неуспешно.
Обратите внимание, каким образом реализация операции >>>=
для типа >Maybe
отражает именно эту логику, когда проверяется, равно ли значение >Nothing
, и действие производится на основе этих сведений. Если значение равно >Nothing
, она незамедлительно возвращает результат >Nothing
. Если значение не равно >Nothing
, она продолжает работу с тем, что находится внутри конструктора >Just
.
В этом разделе мы рассмотрели, как некоторые функции работают лучше, когда возвращаемые ими значения поддерживают неудачу. Превращая эти значения в значения типа >Maybe
и заменяя обычное применение функций вызовом операции >>>=
, мы практически даром получили механизм обработки вычислений, которые могут оканчиваться неудачно. Причина в том, что операция >>>=
должна сохранять контекст значения, к которому она применяет функции. В данном случае контекстом являлось то, что наши значения были значениями с неуспехом в вычислениях. Поэтому когда мы применяли к таким значениям функции, всегда учитывалась вероятность неуспеха.