Spec-Zone.ru › Haskell 7

Control.Applicative

Copyright Conor McBride and Ross Paterson 2005
License BSD-style (see the LICENSE file in the distribution)
Maintainer libraries@haskell.org
Stability experimental
Portability portable
Safe Haskell Trustworthy
Language Haskell2010

Содержание

  • Аппликативные функторы
  • Альтернативы
  • Экземпляры
  • Вспомогательные функции

Описание

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

  • он имеет больше экземпляров.
  • он достаточен для многих применений, например, контекстно-свободного разбора или класса Traversable.
  • экземпляры могут выполнять анализ вычислений до их выполнения и, таким образом, создавать общие оптимизации.

Этот интерфейс был введен для парсеров Никласом Рёджемо, поскольку он допускает больше общего, чем моноидный интерфейс. Имена здесь в основном основаны на работе по разбору Дойтсе Свиерстры.

Для получения дополнительной информации см. Applicative Programming with Effects, Конор Макбрайд и Росс Патерсон.

Applicative functors

class Functor f => Applicative f where Source

Функтор с применением, предоставляющий операции для

  • встраивания чистых выражений (pure), и
  • последовательного выполнения вычислений и объединения их результатов (<*>).

Минимальное полное определение должно включать реализации этих функций, удовлетворяющих следующим законам:

тождество
pure id <*> v = v
композиция
pure (.) <*> u <*> v <*> w = u <*> (v <*> w)
гомоморфизм
pure f <*> pure x = pure (f x)
взаимозаменяемость
u <*> pure y = pure ($ y) <*> u

Другие методы имеют следующие определения по умолчанию, которые могут быть переопределены с помощью эквивалентных специализированных реализаций:

  • u *> v = pure (const id) <*> u <*> v
  • u <* v = pure const <*> u <*> v

Как следствие этих законов, экземпляр Functor для f будет удовлетворять

  • fmap f x = pure f <*> x

Если f также является Monad, он должен удовлетворять

  • pure = return
  • (<*>) = ap

(что подразумевает, что pure и <*> удовлетворяют законам аппликативного функтора).

Минимальное полное определение

pure, (<*>)

Методы

pure :: a -> f a Source

Поднять значение.

(<*>) :: f (a -> b) -> f a -> f b infixl 4 Source

Последовательное применение.

(*>) :: f a -> f b -> f b infixl 4 Source

Последовательность действий, отбрасывание значения первого аргумента.

(<*) :: f a -> f b -> f a infixl 4 Source

Последовательность действий, отбрасывание значения второго аргумента.

Экземпляры

Applicative []
Applicative IO
Applicative Maybe
Applicative ReadP
Applicative ReadPrec
Applicative Last
Applicative First
Applicative STM
Applicative ZipList
Applicative Identity
Applicative ((->) a)
Applicative (Either e)
Monoid a => Applicative ((,) a)
Applicative (ST s)
Applicative (Proxy *)
Arrow a => Applicative (ArrowMonad a)
Monad m => Applicative (WrappedMonad m)
Monoid m => Applicative (Const m)
Applicative (ST s)
Applicative f => Applicative (Alt * f)
Arrow a => Applicative (WrappedArrow a b)

Альтернативы

class Applicative f => Alternative f where Source

Моноид на аппликативных функторах.

Если определено, some и many должны быть наименьшими решениями уравнений:

  • some v = (:) <$> v <*> many v
  • many v = some v <|> pure []

Минимальное полное определение

empty, (<|>)

Методы

empty :: f a Source

Тождество <|>

(<|>) :: f a -> f a -> f a infixl 3 Source

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

some :: f a -> f [a] Source

Один или более.

many :: f a -> f [a] Source

Ноль или более.

Примеры реализации

Alternative []
Alternative Maybe
Alternative ReadP
Alternative ReadPrec
Alternative STM
ArrowPlus a => Alternative (ArrowMonad a)
MonadPlus m => Alternative (WrappedMonad m)
Alternative f => Alternative (Alt * f)
(ArrowZero a, ArrowPlus a) => Alternative (WrappedArrow a b)

Примеры реализации

newtype Const a b Исходный код

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

Const

Поля

getConst :: a

Примеры реализации

Bifunctor Const
Functor (Const m)
Monoid m => Applicative (Const m)
Foldable (Const m)
Traversable (Const m)
Generic1 (Const a)
Eq a => Eq (Const a b)
Ord a => Ord (Const a b)
Read a => Read (Const a b)
Show a => Show (Const a b)
Generic (Const a b)
Monoid a => Monoid (Const a b)
type Rep1 (Const a)
type Rep (Const a b)

newtype WrappedMonad m a Исходный код

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

WrapMonad

Поля

unwrapMonad :: m a

Примеры реализации

newtype WrappedArrow a b c Исходный код

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

WrapArrow

Поля

unwrapArrow :: a b c

Примеры реализации

newtype ZipList a Исходный код

Списки, но с Applicative функтором, основанном на сжатии, так что

f <$> ZipList xs1 <*> ... <*> ZipList xsn = ZipList (zipWithn f xs1 ... xsn)

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

ZipList

Поля

getZipList :: [a]

Примеры использования

Функтор ZipList
Применимый ZipList
Generic1 ZipList
Eq a => Eq (ZipList a)
Ord a => Ord (ZipList a)
Read a => Read (ZipList a)
Show a => Show (ZipList a)
Generic (ZipList a)
type Rep1 ZipList
type Rep (ZipList a)

Вспомогательные функции

(<$>) :: Функтор f => (a -> b) -> f a -> f b infixl 4 Исходный код

Инфиксный синоним для fmap.

Примеры

Преобразование из Maybe Int в Maybe String с помощью show:

>>> show <$> Nothing
Nothing
>>> show <$> Just 3
Just "3"

Преобразование из Either Int Int в Either Int String с помощью show:

>>> show <$> Left 17
Left 17
>>> show <$> Right 17
Right "17"

Удваивание каждого элемента списка:

>>> (*2) <$> [1,2,3]
[2,4,6]

Применение even ко второму элементу пары:

>>> even <$> (2,2)
(2,True)

(<$) :: Функтор f => a -> f b -> f a Исходный код

Замена всех местоположений в вводе одним и тем же значением. По умолчанию используется fmap . const, но это можно переопределить с помощью более эффективной версии.

(<**>) :: Применимый f => f a -> f (a -> b) -> f b infixl 4 Исходный код

Вариант <*> с переставленными аргументами.

liftA :: Применимый f => (a -> b) -> f a -> f b Исходный код

Возведение функции в действия. Эта функция может быть использована как значение для fmap в экземпляре Functor.

liftA2 :: Применимый f => (a -> b -> c) -> f a -> f b -> f c Исходный код

Возведение бинарной функции в действия.

liftA3 :: Применимый f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d Исходный код

Возведение тернарной функции в действия.

optional :: Alternative f => f a -> f (Может быть a) Исходный код

Один или ни одного.

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/base-4.8.2.0/Control-Applicative.html

Spec-Zone.ru

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