Control.Arrow
| Авторские права | (c) Ross Paterson 2002 |
|---|---|
| Лицензия | BSD-стиль (см. файл LICENSE в дистрибутиве) |
| Поддерживающий | libraries@haskell.org |
| Стабильность | предварительная |
| Переносимость | переносимый |
| Безопасный Haskell | Надёжный |
| Язык | Haskell2010 |
Содержание
Описание
Основные определения стрелок, основанные на
- Обобщение монад до стрелок, автором John Hughes, Science of Computer Programming 37, стр. 67-111, май 2000.
плюс несколько определений (returnA и loop) из
- Новая нотация для стрелок, автором Ross Paterson, в ICFP 2001, Флоренция, Италия, стр. 229-240.
Эти статьи и дополнительная информация о стрелках доступны по адресу http://www.haskell.org/arrows/.
Стрелки
class Category a => Arrow a where Источник
Базовый класс стрелок.
Примеры должны удовлетворять следующим законам:
arrid =idarr(f >>> g) =arrf >>>arrgfirst(arrf) =arr(firstf)first(f >>> g) =firstf >>>firstgfirstf >>>arrfst=arrfst>>> ffirstf >>>arr(id*** g) =arr(id*** g) >>>firstffirst(firstf) >>>arrassoc=arrassoc>>>firstf
где
assoc ((a,b),c) = (a,(b,c))
Другие комбинаторы имеют разумные определения по умолчанию, которые могут быть переопределены для повышения эффективности.
Методы
arr :: (b -> c) -> a b c Источник
Поднять функцию до стрелки.
first :: a b c -> a (b, d) (c, d) Источник
Пропустить первый компонент входных данных через стрелку аргумента, а остальные скопировать без изменений в выходные данные.
second :: a b c -> a (d, b) (d, c) Источник
Зеркальное отображение first.
Определение по умолчанию можно переопределить более эффективной версией, если нужно.
(***) :: a b c -> a b' c' -> a (b, b') (c, c') infixr 3 Источник
Разделить входные данные между двумя стрелками аргументов и объединить их выходные данные. Обратите внимание, что это, вообще говоря, не функтор.
Определение по умолчанию можно переопределить более эффективной версией, если нужно.
(&&&) :: a b c -> a b c' -> a b (c, c') infixr 3 Источник
Разветвление: отправка входных данных обеим стрелкам аргументов и объединение их выходных данных.
Определение по умолчанию можно переопределить более эффективной версией, если нужно.
newtype Kleisli m a b Источник
Стрелки Kleisli монады.
Конструкторы
| Kleisli | |
Поля
| |
Примеры
| Monad m => Category * (Kleisli m) | |
| MonadFix m => ArrowLoop (Kleisli m) | Обратите внимание, что для многих монад (тех, для которых операция |
| Monad m => ArrowApply (Kleisli m) | |
| Monad m => ArrowChoice (Kleisli m) | |
| MonadPlus m => ArrowPlus (Kleisli m) | |
| MonadPlus m => ArrowZero (Kleisli m) | |
| Monad m => Arrow (Kleisli m) |
Производные комбинаторы
returnA :: Arrow a => a b b Источник
Стрелка тождества, которая играет роль return в нотации стрелок.
(^>>) :: Arrow a => (b -> c) -> a c d -> a b d infixr 1 Источник
Преобразование слева с чистой функцией.
(>>^) :: Arrow a => a b c -> (c -> d) -> a b d infixr 1 Источник
Преобразование справа с чистой функцией.
(>>>) :: Category cat => cat a b -> cat b c -> cat a c infixr 1 Источник
Композиция слева направо.
(<<<) :: Category cat => cat b c -> cat a b -> cat a c infixr 1 Источник
Композиция справа налево.
Варианты справа налево
(<<^) :: Arrow a => a c d -> (b -> c) -> a b d infixr 1 Источник
Преобразование слева с чистой функцией (вариант справа налево).
(^<<) :: Arrow a => (c -> d) -> a b c -> a b d infixr 1 Источник
Преобразование справа с чистой функцией (вариант справа налево).
Операции моноида
class Arrow a => ArrowZero a where Источник
class ArrowZero a => ArrowPlus a where Источник
Моноид на стрелках.
Методы
(<+>) :: a b c -> a b c -> a b c infixr 5 Source
Ассоциативная операция с единицей zeroArrow.
Условные выражения
class Arrow a => ArrowChoice a where Source
Выбор для стрелок, которые его поддерживают. Этот класс лежит в основе конструкций if и case в стрелочной нотации.
Примеры должны удовлетворять следующим законам:
left(arrf) =arr(leftf)left(f >>> g) =leftf >>>leftgf >>>
arrLeft=arrLeft>>>leftfleftf >>>arr(id+++ g) =arr(id+++ g) >>>leftfleft(leftf) >>>arrassocsum=arrassocsum>>>leftf
где
assocsum (Left (Left x)) = Left x assocsum (Left (Right y)) = Right (Left y) assocsum (Right z) = Right (Right z)
Другие комбинаторы имеют разумные определения по умолчанию, которые могут быть переопределены для повышения эффективности.
Минимальное полное определение
Методы
left :: a b c -> a (Either b d) (Either c d) Source
Передавать помеченные входные данные через стрелку-аргумент, пропуская остальные без изменений в выходные данные.
right :: a b c -> a (Either d b) (Either d c) Source
Зеркальное отображение left.
Определение по умолчанию может быть переопределено более эффективной версией при необходимости.
(+++) :: a b c -> a b' c' -> a (Either b b') (Either c c') infixr 2 Source
Разделить входные данные между двумя стрелками-аргументами, перемаркировать и объединить их выходные данные. Обратите внимание, что это вообще не функтор.
Определение по умолчанию может быть переопределено более эффективной версией при необходимости.
(|||) :: a b d -> a c d -> a (Either b c) d infixr 2 Source
Fanin: Разделить входные данные между двумя стрелками-аргументами и объединить их выходные данные.
Определение по умолчанию может быть переопределено более эффективной версией при необходимости.
Примеры
| ArrowChoice (->) | |
| Monad m => ArrowChoice (Kleisli m) |
Применение стрелок
class Arrow a => ArrowApply a where Source
Некоторые стрелки позволяют применять входные данные стрелок к другим входным данным. Примеры должны удовлетворять следующим законам:
first(arr(\x ->arr(\y -> (x,y)))) >>>app=idfirst(arr(g >>>)) >>>app=secondg >>>appfirst(arr(>>> h)) >>>app=app>>> h
Такие стрелки эквивалентны монадам (см. ArrowMonad).
Примеры
| ArrowApply (->) | |
| Monad m => ArrowApply (Kleisli m) |
newtype ArrowMonad a b Source
Класс ArrowApply эквивалентен Monad: любая монада порождает стрелку Kleisli, и любой пример ArrowApply определяет монаду.
Конструкторы
| ArrowMonad (a () b) |
Примеры
| ArrowApply a => Monad (ArrowMonad a) | |
| Arrow a => Functor (ArrowMonad a) | |
| Arrow a => Applicative (ArrowMonad a) | |
| (ArrowApply a, ArrowPlus a) => MonadPlus (ArrowMonad a) | |
| ArrowPlus a => Alternative (ArrowMonad a) |
leftApp :: ArrowApply a => a b c -> a (Either b d) (Either c d) Source
Любой пример ArrowApply может быть преобразован в пример ArrowChoice путем определения left = leftApp.
Обратная связь
class Arrow a => ArrowLoop a where Source
Оператор loop выражает вычисления, в которых выходное значение возвращается как вход, хотя вычисление происходит только один раз. Он лежит в основе конструкции рекурсии по значениям rec в стрелочной нотации. loop должен удовлетворять следующим законам:
- расширение
loop (arr f) = arr (\ b -> fst (fix (\ (c,d) -> f (b,d))))- левое сжатие
loop (first h >>> f) = h >>> loop f- правое сжатие
loop (f >>> first h) = loop f >>> h- сдвиг
loop (f >>> arr (id *** k)) = loop (arr (id *** k) >>> f)- исчезновение
loop (loop f) = loop (arr unassoc >>> f >>> arr assoc)- наложение
second (loop f) = loop (arr assoc >>> second f >>> arr unassoc)
где
assoc ((a,b),c) = (a,(b,c)) unassoc (a,(b,c)) = ((a,b),c)
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/base-4.8.2.0/Control-Arrow.html