Spec-Zone.ru › Haskell 9

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, (first | (***))

Методы

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

Поля

  • runKleisli :: a -> m b
Примеры
Подробности примеров
Monad m => Category (Kleisli m :: Тип -> Тип -> Тип) Исходный код

С тех пор как: base-3.0

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

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

Методы

id :: Kleisli m a a Исходный код

(.) :: Kleisli m b c -> Kleisli m a b -> Kleisli m a c Исходный код

Generic1 (Kleisli m a :: Тип -> Тип) Исходный код
Подробности примера

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

Связанные типы

type Rep1 (Kleisli m a :: Тип -> Тип)

С тех пор как: base-4.14.0.0

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

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

type Rep1 (Kleisli m a :: Тип -> Тип) = D1 ('MetaData "Kleisli" "GHC.Internal.Control.Arrow" "ghc-internal" 'True) (C1 ('MetaCons "Kleisli" 'PrefixI 'True) (S1 ('MetaSel ('Just "runKleisli") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) ((FUN 'Many a :: Тип -> Тип) :.: Rec1 m)))

Методы

from1 :: Kleisli m a a0 -> Rep1 (Kleisli m a) a0 Исходный код

to1 :: Rep1 (Kleisli m a) a0 -> Kleisli m a a0 Исходный код

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

Методы

app :: Kleisli m (Kleisli m b c, b) c Исходный код

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) Исходный код

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

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

Связанные типы

type Rep (Kleisli m a b)

С версии: base-4.14.0.0

Информация о экземпляре

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

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

Методы

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 Rep1 (Kleisli m a :: Тип -> Тип) = D1 ('MetaData "Kleisli" "GHC.Internal.Control.Arrow" "ghc-internal" 'True) (C1 ('MetaCons "Kleisli" 'PrefixI 'True) (S1 ('MetaSel ('Just "runKleisli") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) ((FUN 'Many a :: Тип -> Тип) :.: Rec1 m)))
type Rep (Kleisli m a b) Исходный код

С версии: base-4.14.0.0

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

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

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

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

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

Методы

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

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

С: 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.12.1/docs/libraries/base-4.21.0.0-8e62/Control-Arrow.html

Spec-Zone.ru

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