Spec-Zone.ru › Haskell 8

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

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

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

Примеры
Подробности примеров
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

Подробности примера

Определено в 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 a b Источник

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

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

Kleisli

Поля

  • runKleisli :: a -> m b
Примеры
Подробности примеров
MonadFix m => ArrowLoop (Kleisli m)

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

С версии: 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)
Подробности экземпляра

Определено в Control.Arrow

type Rep1 (Kleisli m a :: Type -> Type) = D1 ('MetaData "Kleisli" "Control.Arrow" "base" 'True) (C1 ('MetaCons "Kleisli" 'PrefixI 'True) (S1 ('MetaSel ('Just "runKleisli") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (((->) a :: Type -> Type) :.: Rec1 m)))
type Rep (Kleisli m a b)
Подробности экземпляра

Определено в Control.Arrow

type Rep (Kleisli m a b) = D1 ('MetaData "Kleisli" "Control.Arrow" "base" 'True) (C1 ('MetaCons "Kleisli" 'PrefixI 'True) (S1 ('MetaSel ('Just "runKleisli") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (a -> m b))))

Производные комбинаторы

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 | (+++))

Методы

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)
Экземпляры
Подробности о экземплярах
ArrowApply a => Monad (ArrowMonad a)

С версии: base-2.1

Подробности об экземпляре

Определено в 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 Источник

Arrow a => Functor (ArrowMonad a)

С версии: base-4.6.0.0

Подробности об экземпляре

Определено в Control.Arrow

Методы

fmap :: (a0 -> b) -> ArrowMonad a a0 -> ArrowMonad a b Источник

(<$) :: a0 -> ArrowMonad a b -> ArrowMonad a a0 Источник

Arrow a => Applicative (ArrowMonad a)

С версии: base-4.6.0.0

Подробности об экземпляре

Определено в 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 Источник

(ArrowApply a, ArrowPlus a) => MonadPlus (ArrowMonad a)

С версии: base-4.6.0.0

Подробности об экземпляре

Определено в Control.Arrow

Методы

mzero :: ArrowMonad a a0 Источник

mplus :: ArrowMonad a a0 -> ArrowMonad a a0 -> ArrowMonad a a0 Источник

ArrowPlus a => Alternative (ArrowMonad a)

С версии: base-4.6.0.0

Подробности об экземпляре

Определено в 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] Источник

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)

Методы

loop :: a (b, d) (c, d) -> a b c Источник

Примеры
Подробности примеров
MonadFix m => ArrowLoop (Kleisli m)

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

С момента: 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

Spec-Zone.ru

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