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 :: 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 ╭─────╮ c >───┼─ f ─┼───> >───┼─ g ─┼───> b'╰─────╯ 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 | |
Поля
| |
Экземпляры
| Monad m => Category (Kleisli m :: Type -> Type -> Type) Источник | Начиная с: base-3.0 |
||||
| Generic1 (Kleisli m a :: Type -> Type) Источник | |||||
Определено в GHC.Internal.Control.Arrow Ассоциированные типы
| |||||
| 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') Источник | |||||
| Monad m => ArrowApply (Kleisli m) Источник | Начиная с: base-2.1 |
||||
Определено в GHC.Internal.Control.Arrow | |||||
| 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 Источник | |||||
| MonadFix m => ArrowLoop (Kleisli m) Источник |
Следует учитывать, что для многих монад (тех, для которых операция Начиная с: base-2.1 |
||||
Определено в GHC.Internal.Control.Arrow | |||||
| MonadPlus m => ArrowPlus (Kleisli m) Источник | Начиная с: base-2.1 |
||||
| MonadPlus m => ArrowZero (Kleisli m) Источник | Начиная с: base-2.1 |
||||
Определено в GHC.Internal.Control.Arrow | |||||
| Alternative m => Alternative (Kleisli m a) Источник | Начиная с: base-4.14.0.0 |
||||
| 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 |
||||
| Monad m => Monad (Kleisli m a) Источник | Начиная с: base-4.14.0.0 |
||||
| MonadPlus m => MonadPlus (Kleisli m a) Источник | Начиная с: base-4.14.0.0 |
||||
| Generic (Kleisli m a b) Источник | |||||
Определено в GHC.Internal.Control.Arrow Ассоциированные типы
| |||||
| 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 :: Arrow a => a b b Исходный код
Стрелка тождества, играющая роль return в стрелочной нотации.
b >───>
(^>>) :: Arrow a => (b -> c) -> a c d -> a b d infixr 1 Исходный код
Предварительная композиция с чистой функцией.
(>>^) :: Arrow a => a b c -> (c -> d) -> a b d infixr 1 Исходный код
Посткомпозиция с чистой функцией.
(>>>) :: forall {k} cat (a :: k) (b :: k) (c :: k). Category cat => cat a b -> cat b c -> cat a c infixr 1 Исходный код
Композиция слева направо. Полезна, если нужно записать морфизм в виде конвейера, направленного слева направо.
(<<<) :: forall {k} cat (b :: k) (c :: k) (a :: k). 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 :: Type -> Type -> Type) 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 :: Type -> Type -> Type) 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 :: Type -> Type -> Type) 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 Исходный код
Объединение ветвей: разделить вход между двумя стрелками-аргументами и объединить их выходы.
При необходимости определение по умолчанию можно переопределить более эффективной версией.
Экземпляры
| 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 |
Определено в GHC.Internal.Control.Arrow Методы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 :: Type -> Type -> Type) 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 :: Type -> Type -> Type) b Исходный код
Класс ArrowApply эквивалентен Monad: любая монада порождает стрелку Kleisli, а любой экземпляр ArrowApply определяет монаду.
Конструкторы
| ArrowMonad (a () b) |
Экземпляры
leftApp :: ArrowApply a => a b c -> a (Either b d) (Either c d) Исходный код
Любой экземпляр ArrowApply можно преобразовать в экземпляр ArrowChoice, определив left = leftApp.
Обратная связь
class Arrow a => ArrowLoop (a :: Type -> Type -> Type) where Исходный код
Оператор 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 Методыloop :: Kleisli m (b, d) (c, d) -> Kleisli m b c Исходный код | |
| ArrowLoop (->) Исходный код | Начиная с: base-2.1 |
Определён в GHC.Internal.Control.Arrow Методыloop :: ((b, d) -> (c, d)) -> b -> c Исходный код | |
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.14.1/docs/libraries/base-4.22.0.0-66f8/Control-Arrow.html