Изучай Haskell во имя добра! (Липовача) - страница 293

, и сцепление функций подобным образом работать не будет. У нас была похожая проблема, когда в главе 13 мы имели дело с нашим канатоходцем. Он тоже проходил один шаг за раз, и каждый из его шагов мог привести к неудаче, потому что несколько птиц могли приземлиться на одну сторону его балансировочного шеста, что приводило к падению.

Теперь шутить будут над нами, потому что мы – те, кто производит обход, и обходим мы лабиринт нашей собственной разработки. К счастью, мы можем поучиться у канатоходца и сделать то, что сделал он: заменить обычное применение функций оператором >>>=. Он берёт значение с контекстом (в нашем случае это значение типа >Maybe (Zipper a), которое имеет контекст возможной неудачи) и передаёт его в функцию, обеспечивая при этом обработку контекста. Так что, как и наш канатоходец, мы отдадим все наши старые операторы >–: в счёт приобретения операторов >>>=. Затем мы вновь сможем сцеплять наши функции! Смотрите, как это работает:

>ghci> let coolTree = Node 1 Empty (Node 3 Empty Empty)

>ghci> return (coolTree, []) >>= goRight

>Just (Node 3 Empty Empty,[RightCrumb 1 Empty])

>ghci> return (coolTree, []) >>= goRight >>= goRight

>Just (Empty,[RightCrumb 3 Empty,RightCrumb 1 Empty])

>ghci> return (coolTree, []) >>= goRight >>= goRight >>= goRight

>Nothing

Мы использовали функцию >return, чтобы поместить застёжку в конструктор >Just, а затем прибегли к оператору >>>=, чтобы передать это дело нашей функции >goRight. Сначала мы создали дерево, которое в своей левой части имеет пустое поддерево, а в правой – узел, имеющий два пустых поддерева. Когда мы пытаемся пойти вправо один раз, результатом становится успех, потому что операция имеет смысл. Пойти вправо во второй раз – тоже нормально. В итоге мы получаем фокус на пустом поддереве. Но идти вправо третий раз не имеет смысла: мы не можем пойти вправо от пустого поддерева! Поэтому результат – >Nothing.

Теперь мы снабдили наши деревья «сеткой безопасности», которая поймает нас, если мы свалимся. (Ух ты, хорошую метафору я подобрал.)

ПРИМЕЧАНИЕ. В нашей файловой системе также имеется много случаев, когда операция может завершиться неуспешно, как, например, попытка сфокусироваться на несуществующем файле или каталоге. В качестве упражнения вы можете снабдить нашу файловую систему функциями, которые завершаются неудачей мягко, используя монаду >Maybe.

Благодарю за то, что прочитали!

…Или, по крайней мере, пролистали до последней страницы! Я надеюсь, вы нашли эту книгу полезной и весёлой. Я постарался дать вам хорошее понимание языка Haskell и его идиом. Хотя при изучении этого языка всегда открывается что-то новое, вы теперь сможете писать классный код, а также читать и понимать код других людей. Так что скорее приступайте к делу! Увидимся в мире программирования!