Haskell/Стрелки
Примечание: текст ещё не вычитывался
Вступление
правитьСтрелки -- это обобщение монад. С их помощью можно делать всё то же самое, что и с монадами, и даже больше. Они предназначены для той же цели, что и монады, а именно: обеспечение общей структуры для библиотек, -- но в более общем виде. Например, они позволяют работать с вычислениями, которые могут быть частично статическими, т.е. независимыми от вводных данных), или могут иметь несколько входов. Если ваша программа отлично работает на монадах, с тем же успехом её можно переписать и на стрелках. А если вы используете конструкцию очень похожую на монаду, но на самом деле ею не являющуюся, то, возможно, это стрелка.
proc и хвост (tail) стрелки
правитьДавайте сначала разберёмся со стрелочной нотацией. Мы будем работать с самой простейшей стрелкой, с функцией, и напишем маленькую бесполезную программу лишь только для того, чтобы познакомиться с синтаксисом.
Запустите свой текстовый редактор и создайте файл. Назовите его, например, toyArrows.hs:
import Control.Arrow (returnA) idA :: a -> a idA = proc a -> returnA -< a plusOne :: Int -> Int plusOne = proc a -> returnA -< (a+1)
Это наши первые две стрелки. Первая -- это функция тождества в виде стрелки. А вот вторая вызывает несколько больший интерес. Это стрелка, которая увеличивает на единицу число на входе. Загрузите GHCi с параметром -farrows и посмотрите, как они работают.
% ghci -farrows toyArrows.hs ___ ___ _ / _ \ /\ /\/ __(_) / /_\// /_/ / / | | GHC Interactive, version 6.4.1, for Haskell 98. / /_\\/ __ / /___| | http://www.haskell.org/ghc/ \____/\/ /_/\____/|_| Type :? for help. Loading package base-1.0 ... linking ... done. Compiling Main ( toyArrows.hs, interpreted ) Ok, modules loaded: Main. *Main> idA 3 3 *Main> idA "foo" "foo" *Main> plusOne 3 4 *Main> plusOne 100 101