Haskell/Стрелки: различия между версиями

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
Новая: ==Вступление== '''Примечание: текст ещё не вычитывался''' Стрелки это обобщение монад. С их помощью можн...
 
Нет описания правки
Строка 1: Строка 1:
'''Примечание: текст ещё не вычитывался'''

==Вступление==
==Вступление==


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

==proc и хвост (tail) стрелки==

Давайте сначала разберёмся со стрелочной нотацией. Мы будем работать с самой простейшей стрелкой, с функцией, и напишем маленькую бесполезную программу лишь только для того, чтобы познакомиться с синтаксисом.

Запустите свой текстовый редактор и создайте файл. Назовите его, например, toyArrows.hs:
<pre>
import Control.Arrow (returnA)

idA :: a -> a
idA = proc a -> returnA -< a


plusOne :: Int -> Int
Стрелки это обобщение монад. С их помощью можно делать всё то же самое, что и с монадами, и даже больше. Они предназначены для той же цели, что и монады, а именно: обеспечение общей структуры для библиотек, -- но в более общем виде. Например, они позволяют работать с вычислениями, которые могут быть частично статическими, т.е. независимыми от вводных данных), или могут иметь несколько входов. Если ваша программа отлично работает на монадах, с тем же успехом её можно переписать и на стрелках. А если вы используете конструкцию очень похожую на монаду, но на самом деле ею не являющуюся, то, возможно, это стрелка.
plusOne = proc a -> returnA -< (a+1)
</pre>


Это наши первые две стрелки. Первая -- это функция тождества в виде стрелки. А вот вторая вызывает несколько больший интерес. Это стрелка, которая увеличивает на единицу число на входе. Загрузите GHCi с параметром -farrows и посмотрите, как они работают.
===proc and the arrow tail===


<pre>
Let's begin by getting to grips with the arrows notation. We'll work with the simplest possible arrow there is (the function) and build some toy programs strictly in the aims of getting acquainted with the syntax.
% 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.
Fire up your text editor and create a Haskell file, say toyArrows.hs:
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
</pre>

Версия от 17:41, 10 мая 2007

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

Вступление

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

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