Примечание: текст ещё не вычитывался

Вступление

править

Стрелки -- это обобщение монад. С их помощью можно делать всё то же самое, что и с монадами, и даже больше. Они предназначены для той же цели, что и монады, а именно: обеспечение общей структуры для библиотек, -- но в более общем виде. Например, они позволяют работать с вычислениями, которые могут быть частично статическими, т.е. независимыми от вводных данных), или могут иметь несколько входов. Если ваша программа отлично работает на монадах, с тем же успехом её можно переписать и на стрелках. А если вы используете конструкцию очень похожую на монаду, но на самом деле ею не являющуюся, то, возможно, это стрелка.

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