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