Control.Arrow
| Авторские права | (c) Ross Paterson 2002 |
|---|---|
| Лицензия | BSD-стиль (см. файл LICENSE в дистрибутиве) |
| Поддержка | libraries@haskell.org |
| Стабильность | временная |
| Переносимость | переносимая |
| Safe Haskell | Safe |
| Язык | Haskell2010 |
Описание
Основные определения стрелок, основанные на
- Обобщение монад до стрелок, Джоном Хьюзом, Наука о программировании на компьютере 37, стр. 67-111, май 2000.
плюс несколько определений (returnA и loop) из
- Новая запись для стрелок, Россом Патерсоном, в ICFP 2001, Флоренция, Италия, стр. 229-240.
Эти статьи и дополнительная информация о стрелках доступны по адресу http://www.haskell.org/arrows/.
Стрелки
class Category a => Arrow (a :: Type -> Type -> Type) 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 :: (b -> c) -> a b c Исходный код
Поднимает функцию до стрелки.
b ╭───╮ c
>───┤ f ├───>
╰───╯
first :: a b c -> a (b, d) (c, d) Исходный код
Отправляет первую компоненту входных данных через стрелку аргумента и копирует остальное без изменений в выходные данные.
Определение по умолчанию может быть переопределено более эффективной версией, если это необходимо.
b ╭─────╮ c >───┼─ f ─┼───> >───┼─────┼───> d ╰─────╯ d
second :: a b c -> a (d, b) (d, c) Исходный код
Отправляет вторую компоненту входных данных через стрелку аргумента и копирует остальное без изменений в выходные данные.
Определение по умолчанию может быть переопределено более эффективной версией, если это необходимо.
d ╭─────╮ d >───┼─────┼───> >───┼─ f ─┼───> b ╰─────╯ c
(***) :: a b c -> a b' c' -> a (b, b') (c, c') infixr 3 Исходный код
Разделяет входные данные между двумя стрелками аргументов и объединяет их выходные данные. Обратите внимание, что это вообще не функтор.
Определение по умолчанию может быть переопределено более эффективной версией, если это необходимо.
b ╭─────╮ b' >───┼─ f ─┼───> >───┼─ g ─┼───> c ╰─────╯ c'
(&&&) :: a b c -> a b c' -> a b (c, c') infixr 3 Исходный код
Разветвление: отправляет входные данные обеим стрелкам аргументов и объединяет их выходные данные.
Определение по умолчанию может быть переопределено более эффективной версией, если это необходимо.
╭───────╮ c
b │ ┌─ f ─┼───>
>───┼─┤ │
│ └─ g ─┼───>
╰───────╯ c'
Экземпляры
| Monad m => Arrow (Kleisli m) Исходный код | С: base-2.1 |
Определено в GHC.Internal.Control.Arrow Методыarr :: (b -> c) -> Kleisli m b c Исходный код first :: Kleisli m b c -> Kleisli m (b, d) (c, d) Исходный код second :: Kleisli m b c -> Kleisli m (d, b) (d, c) Исходный код (***) :: Kleisli m b c -> Kleisli m b' c' -> Kleisli m (b, b') (c, c') Исходный код (&&&) :: Kleisli m b c -> Kleisli m b c' -> Kleisli m b (c, c') Исходный код | |
| Arrow (->) Исходный код | С: base-2.1 |
Определено в GHC.Internal.Control.Arrow Методыarr :: (b -> c) -> b -> c Исходный код first :: (b -> c) -> (b, d) -> (c, d) Исходный код second :: (b -> c) -> (d, b) -> (d, c) Исходный код (***) :: (b -> c) -> (b' -> c') -> (b, b') -> (c, c') Исходный код (&&&) :: (b -> c) -> (b -> c') -> b -> (c, c') Исходный код | |
newtype Kleisli (m :: Type -> Type) a b Исходный код
Стрелки Kleisli монады.
Конструкторы
| Kleisli | |
Поля
| |
Примеры
Определено в GHC.Internal.Control.Arrow Методыleft :: Kleisli m b c -> Kleisli m (Either b d) (Either c d) Исходный код right :: Kleisli m b c -> Kleisli m (Either d b) (Either d c) Исходный код (+++) :: Kleisli m b c -> Kleisli m b' c' -> Kleisli m (Either b b') (Either c c') Исходный код (|||) :: Kleisli m b d -> Kleisli m c d -> Kleisli m (Either b c) d Исходный код | |
| MonadFix m => ArrowLoop (Kleisli m) Исходный код |
Обратите внимание, что для многих монад (тех, для которых операция С момента: base-2.1 |
Определено в GHC.Internal.Control.Arrow Методыloop :: Kleisli m (b, d) (c, d) -> Kleisli m b c Исходный код | |
| MonadPlus m => ArrowPlus (Kleisli m) Исходный код | С момента: base-2.1 |
Определено в GHC.Internal.Control.Arrow Методы(<+>) :: Kleisli m b c -> Kleisli m b c -> Kleisli m b c Исходный код | |
| MonadPlus m => ArrowZero (Kleisli m) Исходный код | С момента: base-2.1 |
Определено в GHC.Internal.Control.Arrow МетодыzeroArrow :: Kleisli m b c Исходный код | |
| Alternative m => Alternative (Kleisli m a) Исходный код | С момента: base-4.14.0.0 |
Определено в GHC.Internal.Control.Arrow Методыempty :: Kleisli m a a0 Исходный код (<|>) :: Kleisli m a a0 -> Kleisli m a a0 -> Kleisli m a a0 Исходный код some :: Kleisli m a a0 -> Kleisli m a [a0] Исходный код many :: Kleisli m a a0 -> Kleisli m a [a0] Исходный код | |
| Applicative m => Applicative (Kleisli m a) Исходный код | С момента: base-4.14.0.0 |
Определено в GHC.Internal.Control.Arrow Методыpure :: a0 -> Kleisli m a a0 Исходный код (<*>) :: Kleisli m a (a0 -> b) -> Kleisli m a a0 -> Kleisli m a b Исходный код liftA2 :: (a0 -> b -> c) -> Kleisli m a a0 -> Kleisli m a b -> Kleisli m a c Исходный код (*>) :: Kleisli m a a0 -> Kleisli m a b -> Kleisli m a b Исходный код (<*) :: Kleisli m a a0 -> Kleisli m a b -> Kleisli m a a0 Исходный код | |||||
| Functor m => Functor (Kleisli m a) Исходный код | С версии: base-4.14.0.0 |
||||
Определено в GHC.Internal.Control.Arrow Методыfmap :: (a0 -> b) -> Kleisli m a a0 -> Kleisli m a b Исходный код (<$) :: a0 -> Kleisli m a b -> Kleisli m a a0 Исходный код | |||||
| Monad m => Monad (Kleisli m a) Исходный код | С версии: base-4.14.0.0 |
||||
Определено в GHC.Internal.Control.Arrow Методы(>>=) :: Kleisli m a a0 -> (a0 -> Kleisli m a b) -> Kleisli m a b Исходный код (>>) :: Kleisli m a a0 -> Kleisli m a b -> Kleisli m a b Исходный код return :: a0 -> Kleisli m a a0 Исходный код | |||||
| MonadPlus m => MonadPlus (Kleisli m a) Исходный код | С версии: base-4.14.0.0 |
||||
Определено в GHC.Internal.Control.Arrow Методыmzero :: Kleisli m a a0 Исходный код mplus :: Kleisli m a a0 -> Kleisli m a a0 -> Kleisli m a a0 Исходный код | |||||
| Generic (Kleisli m a b) Исходный код | |||||
Определено в GHC.Internal.Control.Arrow Связанные типы
Методыfrom :: Kleisli m a b -> Rep (Kleisli m a b) x Исходный код to :: Rep (Kleisli m a b) x -> Kleisli m a b Исходный код | |||||
| type Rep1 (Kleisli m a :: Type -> Type) Исходный код | С версии: base-4.14.0.0 |
||||
Определено в GHC.Internal.Control.Arrow | |
| type Rep (Kleisli m a b) Исходный код | С версии: base-4.14.0.0 |
Определено в GHC.Internal.Control.Arrow | |
Производные комбинаторы
returnA :: Стрелка a => a b b Исходный код
Тождественная стрелка, играющая роль return в записи стрелок.
b >───>
(^>>) :: Стрелка a => (b -> c) -> a c d -> a b d infixr 1 Исходный код
Представление с чистой функцией.
(>>^) :: Стрелка a => a b c -> (c -> d) -> a b d infixr 1 Исходный код
Последовательное применение чистой функции.
(>>>) :: forall {k} cat (a :: k) (b :: k) (c :: k). Категория cat => cat a b -> cat b c -> cat a c infixr 1 Исходный код
Композиция слева направо. Это полезно, если вы хотите записать морфизм как конвейер, идущий слева направо.
(<<<) :: forall {k} cat (b :: k) (c :: k) (a :: k). Категория cat => cat b c -> cat a b -> cat a c infixr 1 Исходный код
Композиция справа налево. Это синоним для (.), но может быть полезно, чтобы сделать порядок композиции более очевидным.
Варианты справа налево
(<<^) :: Стрелка a => a c d -> (b -> c) -> a b d infixr 1 Исходный код
Представление с чистой функцией (вариант справа налево).
(^<<) :: Стрелка a => (c -> d) -> a b c -> a b d infixr 1 Исходный код
Последовательное применение чистой функции (вариант справа налево).
Операции моноида
class Стрелка a => ArrowZero (a :: Тип -> Тип -> Тип) where Исходный код
Методы
zeroArrow :: a b c Исходный код
Экземпляры
| MonadPlus m => ArrowZero (Kleisli m) Исходный код | С версии: base-2.1 |
Определено в GHC.Internal.Control.Arrow МетодыzeroArrow :: Kleisli m b c Исходный код | |
class ArrowZero a => ArrowPlus (a :: Тип -> Тип -> Тип) where Исходный код
Моноид на стрелках.
Методы
(<+>) :: a b c -> a b c -> a b c infixr 5 Исходный код
Ассоциативная операция с тождественным элементом zeroArrow.
Примеры реализации
| MonadPlus m => ArrowPlus (Kleisli m) Исходный код | С момента выпуска: base-2.1 |
Определено в GHC.Internal.Control.Arrow Методы(<+>) :: Kleisli m b c -> Kleisli m b c -> Kleisli m b c Исходный код | |
Условные выражения
class Arrow a => ArrowChoice (a :: Тип -> Тип -> Тип) where Исходный код
Выбор, для стрелок, которые его поддерживают. Этот класс лежит в основе конструкций 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 :: a b c -> a (Either b d) (Either c d) Исходный код
Обрабатывает помеченные входные данные через стрелку аргумента, передавая остальное без изменений на вывод.
right :: a b c -> a (Either d b) (Either d c) Исходный код
Зеркальное отображение left.
Определение по умолчанию может быть переопределено более эффективной версией, если это необходимо.
(+++) :: a b c -> a b' c' -> a (Either b b') (Either c c') infixr 2 Исходный код
Разделяет входные данные между двумя стрелками аргументов, переименовывает и объединяет их выходы. Обратите внимание, что это вообще не функтор.
Определение по умолчанию может быть переопределено более эффективной версией, если это необходимо.
(|||) :: a b d -> a c d -> a (Either b c) d infixr 2 Исходный код
Fanin: Разделяет входные данные между двумя стрелками аргументов и объединяет их выходы.
Определение по умолчанию может быть переопределено более эффективной версией, если это необходимо.
Примеры реализации
| Monad m => ArrowChoice (Kleisli m) Исходный код | С момента выпуска: base-2.1 |
Определено в GHC.Internal.Control.Arrow Методыleft :: Kleisli m b c -> Kleisli m (Either b d) (Either c d) Исходный код right :: Kleisli m b c -> Kleisli m (Either d b) (Either d c) Исходный код (+++) :: Kleisli m b c -> Kleisli m b' c' -> Kleisli m (Either b b') (Either c c') Исходный код (|||) :: Kleisli m b d -> Kleisli m c d -> Kleisli m (Either b c) d Исходный код | |
| ArrowChoice (->) Исходный код | С момента выпуска: base-2.1 |
Методыleft :: (b -> c) -> Either b d -> Either c d Исходный код right :: (b -> c) -> Either d b -> Either d c Исходный код (+++) :: (b -> c) -> (b' -> c') -> Either b b' -> Either c c' Исходный код (|||) :: (b -> d) -> (c -> d) -> Either b c -> d Исходный код | |
Применение стрелок
class Arrow a => ArrowApply (a :: Тип -> Тип -> Тип) where Исходный код
Некоторые стрелки позволяют применять входные данные стрелки к другим входным данным. Примеры реализации должны удовлетворять следующим законам:
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 Исходный код
Примеры
| Monad m => ArrowApply (Kleisli m) Исходный код | С момента выпуска: base-2.1 |
Определено в GHC.Internal.Control.Arrow Методыapp :: Kleisli m (Kleisli m b c, b) c Исходный код | |
| ArrowApply (->) Исходный код | С момента выпуска: base-2.1 |
Определено в GHC.Internal.Control.Arrow Методыapp :: (b -> c, b) -> c Исходный код | |
newtype ArrowMonad (a :: Тип -> Тип -> Тип) b Исходный код
Класс ArrowApply эквивалентен классу Monad: любой монада порождает стрелку Kleisli, и любой экземпляр ArrowApply определяет монаду.
Конструкторы
| ArrowMonad (a () b) |
Экземпляры
| ArrowPlus a => Alternative (ArrowMonad a) Источник | С версии: base-4.6.0.0 |
Определено в GHC.Internal.Control.Arrow Методыempty :: ArrowMonad a a0 Источник (<|>) :: ArrowMonad a a0 -> ArrowMonad a a0 -> ArrowMonad a a0 Источник some :: ArrowMonad a a0 -> ArrowMonad a [a0] Источник many :: ArrowMonad a a0 -> ArrowMonad a [a0] Источник | |
| Arrow a => Applicative (ArrowMonad a) Источник | С версии: base-4.6.0.0 |
Определено в GHC.Internal.Control.Arrow Методыpure :: a0 -> ArrowMonad a a0 Источник (<*>) :: ArrowMonad a (a0 -> b) -> ArrowMonad a a0 -> ArrowMonad a b Источник liftA2 :: (a0 -> b -> c) -> ArrowMonad a a0 -> ArrowMonad a b -> ArrowMonad a c Источник (*>) :: ArrowMonad a a0 -> ArrowMonad a b -> ArrowMonad a b Источник (<*) :: ArrowMonad a a0 -> ArrowMonad a b -> ArrowMonad a a0 Источник | |
| Arrow a => Functor (ArrowMonad a) Источник | С версии: base-4.6.0.0 |
Определено в GHC.Internal.Control.Arrow Методыfmap :: (a0 -> b) -> ArrowMonad a a0 -> ArrowMonad a b Источник (<$) :: a0 -> ArrowMonad a b -> ArrowMonad a a0 Источник | |
| ArrowApply a => Monad (ArrowMonad a) Источник | С версии: base-2.1 |
Определено в GHC.Internal.Control.Arrow Методы(>>=) :: ArrowMonad a a0 -> (a0 -> ArrowMonad a b) -> ArrowMonad a b Источник (>>) :: ArrowMonad a a0 -> ArrowMonad a b -> ArrowMonad a b Источник return :: a0 -> ArrowMonad a a0 Источник | |
| (ArrowApply a, ArrowPlus a) => MonadPlus (ArrowMonad a) Источник | С версии: base-4.6.0.0 |
Определено в GHC.Internal.Control.Arrow Методыmzero :: ArrowMonad a a0 Источник mplus :: ArrowMonad a a0 -> ArrowMonad a a0 -> ArrowMonad a a0 Источник | |
leftApp :: ArrowApply a => a b c -> a (Either b d) (Either c d) Источник
Любой экземпляр ArrowApply может быть преобразован в экземпляр ArrowChoice путем определения left = leftApp.
Обратная связь
класс Arrow a => ArrowLoop (a :: Тип -> Тип -> Тип) где Источник
Оператор 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 Источник
╭──────────────╮
b │ ╭───╮ │ c
>───┼─────┤ ├────┼───>
│ ┌─┤ ├─┐ │
│ d │ ╰───╯ │ │
│ └───<───┘ │
╰──────────────╯
Примеры реализации
| MonadFix m => ArrowLoop (Kleisli m) Источник |
Обратите внимание, что для многих монад (тех, для которых операция С: base-2.1 |
Определено в GHC.Internal.Control.Arrow | |
| ArrowLoop (->) Источник | С: base-2.1 |
Определено в GHC.Internal.Control.Arrow | |
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.12.1/docs/libraries/base-4.21.0.0-8e62/Control-Arrow.html