Control.Arrow
| Авторские права | (с) Ross Paterson 2002 |
|---|---|
| Лицензия | BSD-стиль (см. файл LICENSE в дистрибутиве) |
| Поддержка | libraries@haskell.org |
| Стабильность | предварительная |
| Переносимость | переносимая |
| Безопасный Haskell | Надёжный |
| Язык | Haskell2010 |
Описание
Основные определения стрелок, основанные на
- Обобщение монад на стрелки, Джона Хьюза, Наука о программировании на компьютере 37, стр. 67-111, май 2000 г.
плюс несколько определений (returnA и loop) из
- Новая нотация для стрелок, Росса Патерсона, в 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 :: (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 Источник
Разветвление: направить входные данные в обе стрелки-аргумента и объединить их выходные данные.
Определение по умолчанию может быть переопределено более эффективной версией, если это необходимо.
Примеры
| Monad m => Arrow (Kleisli m) | С момента: base-2.1 |
Определено в 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 |
newtype Kleisli m a b Источник
Стрелки Kleisli монады.
Конструкторы
| Kleisli | |
Поля
| |
Примеры
| MonadFix m => ArrowLoop (Kleisli m) |
Обратите внимание, что для многих монад (тех, для которых операция С версии: base-2.1 |
Определено в Control.Arrow Методыloop :: Kleisli m (b, d) (c, d) -> Kleisli m b c Исходный код | |
| Monad m => ArrowApply (Kleisli m) | С версии: base-2.1 |
Определено в Control.Arrow Методыapp :: Kleisli m (Kleisli m b c, b) c Исходный код | |
| Monad m => ArrowChoice (Kleisli m) | С версии: base-2.1 |
Определено в 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 Исходный код | |
| MonadPlus m => ArrowPlus (Kleisli m) | С версии: base-2.1 |
Определено в Control.Arrow Методы(<+>) :: Kleisli m b c -> Kleisli m b c -> Kleisli m b c Исходный код | |
| MonadPlus m => ArrowZero (Kleisli m) | С версии: base-2.1 |
Определено в Control.Arrow МетодыzeroArrow :: Kleisli m b c Исходный код | |
| Monad m => Arrow (Kleisli m) | С версии: base-2.1 |
Определено в 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 => Category (Kleisli m :: Тип -> Тип -> Тип) | С версии: base-3.0 |
Определено в Control.Arrow Методыid :: forall (a :: k). Kleisli m a a Исходный код (.) :: forall (b :: k) (c :: k) (a :: k). Kleisli m b c -> Kleisli m a b -> Kleisli m a c Исходный код | |
| Generic1 (Kleisli m a :: Тип -> Тип) | С версии: base-4.14.0.0 |
Определено в Control.Arrow Связанные типыtype Rep1 (Kleisli m a) :: k -> Тип Исходный код Методыfrom1 :: forall (a0 :: k). Kleisli m a a0 -> Rep1 (Kleisli m a) a0 Исходный код to1 :: forall (a0 :: k). Rep1 (Kleisli m a) a0 -> Kleisli m a a0 Исходный код | |
| Монадa m => Монадa (Kleisli m a) | С версии: base-4.14.0.0 |
Определено в 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 Исходный код | |
| Функтор m => Функтор (Kleisli m a) | С версии: base-4.14.0.0 |
Определено в Control.Arrow Методыfmap :: (a0 -> b) -> Kleisli m a a0 -> Kleisli m a b Исходный код (<$) :: a0 -> Kleisli m a b -> Kleisli m a a0 Исходный код | |
| Прикладной m => Прикладной (Kleisli m a) | С версии: base-4.14.0.0 |
Определено в 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 Исходный код | |
| Монад плюс m => Монад плюс (Kleisli m a) | С версии: base-4.14.0.0 |
Определено в Control.Arrow Методыmzero :: Kleisli m a a0 Исходный код mplus :: Kleisli m a a0 -> Kleisli m a a0 -> Kleisli m a a0 Исходный код | |
| Альтернатива m => Альтернатива (Kleisli m a) | С версии: base-4.14.0.0 |
Определено в 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] Исходный код | |
| Общий (Kleisli m a b) | С версии: base-4.14.0.0 |
Определено в Control.Arrow Связанные типыtype Rep (Kleisli m a b) :: Type -> Type Исходный код Методы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) | |
| type Rep (Kleisli m a b) | |
Определено в Control.Arrow | |
Производные комбинаторы
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) | С версии: base-2.1 |
Определено в 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 |
Определено в 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 |
Определено в 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 ((->) :: Type -> Type -> Type) | С момента: base-2.1 |
Определено в 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 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 |
Определено в Control.Arrow Методыapp :: Kleisli m (Kleisli m b c, b) c Исходный код | |
| ArrowApply ((->) :: Тип -> Тип -> Тип) | С момента выпуска: base-2.1 |
Определено в Control.Arrow Методыapp :: (b -> c, b) -> c Исходный код | |
newtype ArrowMonad a 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 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)
Примеры
| MonadFix m => ArrowLoop (Kleisli m) |
Обратите внимание, что для многих монад (тех, для которых операция С момента: base-2.1 |
Определено в Control.Arrow Методыloop :: Kleisli m (b, d) (c, d) -> Kleisli m b c Исходный код | |
| ArrowLoop ((->) :: Тип -> Тип -> Тип) | С момента: base-2.1 |
Определено в 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/8.10.2/docs/html/libraries/base-4.14.1.0/Control-Arrow.html