Spec-Zone.ru › Haskell 7

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 Источник

Базовый класс стрелок.

Примеры должны удовлетворять следующим законам:

  • arr id = id
  • arr (f >>> g) = arr f >>> arr g
  • first (arr f) = arr (first f)
  • first (f >>> g) = first f >>> first g
  • first f >>> arr fst = arr fst >>> f
  • first f >>> arr (id *** g) = arr (id *** g) >>> first f
  • first (first f) >>> arr assoc = arr assoc >>> first f

где

assoc ((a,b),c) = (a,(b,c))

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

Минимальное полное определение

arr, first

Методы

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 Источник

Разветвление: отправка входных данных обеим стрелкам аргументов и объединение их выходных данных.

Определение по умолчанию можно переопределить более эффективной версией, если нужно.

Примеры

Arrow (->)
Monad m => Arrow (Kleisli m)

newtype Kleisli m a b Источник

Стрелки Kleisli монады.

Конструкторы

Kleisli

Поля

runKleisli :: a -> m b

Примеры

Monad m => Category * (Kleisli m)
MonadFix m => ArrowLoop (Kleisli m)

Обратите внимание, что для многих монад (тех, для которых операция >>= является строгой) этот экземпляр не будет удовлетворять закону правого сужения, необходимому для класса ArrowLoop.

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 Источник

Методы

zeroArrow :: a b c Источник

Примеры

MonadPlus m => ArrowZero (Kleisli m)

class ArrowZero a => ArrowPlus a where Источник

Моноид на стрелках.

Методы

(<+>) :: a b c -> a b c -> a b c infixr 5 Source

Ассоциативная операция с единицей zeroArrow.

Примеры

MonadPlus m => ArrowPlus (Kleisli m)

Условные выражения

class Arrow a => ArrowChoice a where Source

Выбор для стрелок, которые его поддерживают. Этот класс лежит в основе конструкций if и case в стрелочной нотации.

Примеры должны удовлетворять следующим законам:

  • left (arr f) = arr (left f)
  • left (f >>> g) = left f >>> left g
  • f >>> arr Left = arr Left >>> left f
  • left f >>> arr (id +++ g) = arr (id +++ g) >>> left f
  • left (left f) >>> arr assocsum = arr assocsum >>> left f

где

assocsum (Left (Left x)) = Left x
assocsum (Left (Right y)) = Right (Left y)
assocsum (Right z) = Right (Right z)

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

Минимальное полное определение

left

Методы

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 = id
  • first (arr (g >>>)) >>> app = second g >>> app
  • first (arr (>>> h)) >>> app = app >>> h

Такие стрелки эквивалентны монадам (см. ArrowMonad).

Методы

app :: a (a b c, b) c Source

Примеры

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)

Методы

loop :: a (b, d) (c, d) -> a b c Source

Примеры

ArrowLoop (->)
MonadFix m => ArrowLoop (Kleisli m)

Обратите внимание, что для многих монад (тех, для которых операция >>= является строгой) этот пример не будет удовлетворять закону правого сжатия, необходимому для класса ArrowLoop.

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API