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), и - последовательного выполнения вычислений и объединения их результатов (
<*>).
Минимальное полное определение должно включать реализации этих функций, удовлетворяющих следующим законам:
- тождество
pureid<*>v = v- композиция
pure(.)<*>u<*>v<*>w = u<*>(v<*>w)- гомоморфизм
puref<*>purex =pure(f x)- взаимозаменяемость
u
<*>purey =pure($y)<*>u
Другие методы имеют следующие определения по умолчанию, которые могут быть переопределены с помощью эквивалентных специализированных реализаций:
Как следствие этих законов, экземпляр Functor для f будет удовлетворять
Если f также является Monad, он должен удовлетворять
(что подразумевает, что pure и <*> удовлетворяют законам аппликативного функтора).
Методы
Поднять значение.
(<*>) :: 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 должны быть наименьшими решениями уравнений:
Примеры реализации
| 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 Исходный код
Примеры реализации
| 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 | |
Поля
| |
Примеры реализации
newtype WrappedArrow a b c Исходный код
Конструкторы
| WrapArrow | |
Поля
| |
Примеры реализации
newtype ZipList a Исходный код
Списки, но с Applicative функтором, основанном на сжатии, так что
f<$>ZipListxs1<*>...<*>ZipListxsn =ZipList(zipWithn f xs1 ... xsn)
Конструкторы
| ZipList | |
Поля
| |
Примеры использования
Вспомогательные функции
(<$>) :: Функтор f => (a -> b) -> f a -> f b infixl 4 Исходный код
Инфиксный синоним для fmap.
Примеры
Преобразование из Maybe Int в Maybe String с помощью show:
>>>show <$> NothingNothing>>>show <$> Just 3Just "3"
Преобразование из Either Int Int в Either Int String с помощью show:
>>>show <$> Left 17Left 17>>>show <$> Right 17Right "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