Spec-Zone.ru › Haskell 9

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, (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 ╭─────╮ 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

Поля

  • runKleisli :: a -> m b
Экземпляры
Подробности экземпляров
Monad m => Category (Kleisli m :: Type -> Type -> Type) Источник

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

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

Ассоциированные типы

type Rep1 (Kleisli m a :: Type -> Type)

Начиная с: base-4.14.0.0

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

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

type Rep1 (Kleisli m a :: Type -> Type) = 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 :: Type -> Type) :.: 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 :: Type -> Type) = 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 :: Type -> Type) :.: 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 :: 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 | (+++))

Методы

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

Обратная связь

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

Следует учитывать, что для многих монад (тех, для которых операция >>= строгая) этот экземпляр не будет удовлетворять закону правого стягивания, требуемому классом 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.14.1/docs/libraries/base-4.22.0.0-66f8/Control-Arrow.html

Spec-Zone.ru

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