Главная » Haskell » Модуль Applicative

0

Этот модуль описывает структуру, промежуточную между монадой и функтором. Эта структура предоставляет выстраивать  чистые выражения в последовательности,  но не предоставляет  возможности связывания. Технически эта структура является строго-нестрогим моноидальным функтором — прикладным функтором. Детально о такой структуре описывается в [15]. Главный класс этого модуля очень полезен вместе с экземплярами класса  Traversable (см. раздел 8.28.).

Использование:

import Control.Applicative

Главный класс модуля, описывающий прикладной функтор:

class Functor   f => Applicative  f where pure    :: a ->  f a

(<*>) :: f (a  ->  b)  ->  f a ->  f b

Этот класс описывает функторы,  для которых имеется  возможность осуществления последовательных действий. Он  содержит  два метода: pure —  используется для «втягивания» некоторого значения в функтор, а также (<*>) — последовательное применение функтора.

Каждый  экземпляр класса Applicative должен удовлетворять  следующим правилам:

1)                        Тождество:

pure  id <*> v  = v

2)                        Композиция:

pure  (.) <*> u <*> v  <*> w  = u <*> (v <*> w)

3)                        Гомоморфизм:

pure  f <*> pure  x  = pure  (f x)

4)                        Взаимозаменяемость:

u <*> pure  y  = pure  ($  y) <*> u

Кроме того, экземпляры класса Functor  должны дополнительно удовлетворять правилу:

fmap f x  = pure  f <*> x

Если  тип   f является  монадой,  то   можно   определить pure  =  return

и (<*>) = ap.

Экземплярами класса Applicative являются следующие типы: IO, Id, Maybe, ZipList, [], Const, WrappedMonad, (,), (->) и WrappedArrow. все эти экземпляры описаны в рассматриваемом модуле.

Также в этом модуле описан дополнительный класс Alternatives, который определяет интерфейс к моноиду над функторами, для которых имеется возможность их выстраивания в последовательности действий. Описание этого класса выглядит следующим образом:

class Applicative f =>  Alternative f where empty ::  f  a

(<|>)  :: f a ->  f a ->  f a

Метод empty является тождеством для операции (<|>),  которая, в свою очередь, является ассоциативной бинарной операцией.

Экземплярами  этого   класса   являются   следующие  типы:    Maybe,  [], WrappedMonad и WrappedArrow. Все эти экземпляры описаны в рассматриваемом модуле.

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

Функция: (<$>)

Описание: синоним функции fmap для исключения коллизии.

Определение:

infixl 4 <$>

(<$>)  :: Functor   f => (a  ->  b)  ->  f a ->  f b f <$> a = fmap f a

Функция: (<$)

Описание: функция для замены значения.

Определение:

infixl 4 <$

(<$)   :: Functor   f => a  ->  f b ->  f a (<$)   =  (<$>)  . const

Функция: (*>)

Описание: выполнение последовательных действий с  «уничтожением» первого аргумента.

Определение:

infixl 4 *>

(*>) :: Applicative f => f a  ->  f b ->  f b (*>) = liftA2  (const id)

Функция: (<*)

Описание: выполнение последовательных действий с «уничтожением»  второго аргумента.

Определение:

infixl 4 <*

(<*) :: Applicative f => f a ->  f  b  ->  f a (<*) = liftA2  const

Функция: (<**>)

Описание: вариант метода (<*>) с зарезервированными аргументами.

Определение:

infixl 4 <**>

(<**>) :: Applicative f => f a ->  f (a  ->  b)  ->  f b (<**>) = liftA2 (flip ($))

Функция: liftA

Описание: втягивает функцию в действие. Эта функция может использоваться в качестве входного аргумента для метода fmap в экземплярах класса Functor. Определение:

liftA :: Applicative f => (a  ->  b)  ->  f  a  ->  f b liftA f a = pure  f <*> a

Функция: liftA2

Описание: втягивает в действие функцию с двумя аргументами. Подобна функции liftA.

Определение:

liftA2 :: Applicative f => (a  ->  b ->  c) ->  f a ->  f  b  ->  f c liftA2 f a b = f <$> a <*> b

Функция: liftA3

Описание: втягивает в действие функцию с тремя аргументами. Подобна функции liftA.

Определение:

liftA3 :: Applicative f => (a  ->  b ->  c  ->  d)  ->  f a ->  f b ->  f  c  ->  f d liftA3 f a b c  = f <$> a <*> b <*> c

Функция: optional

Описание: функция для выбора альтернативы: 0 или 1.

Определение:

optional :: Alternative f => f a ->  f (Maybe a) optional v  = Just  <$> v  <|> pure  Nothing

Функция: some

Описание: функция для выбора альтернативы: 1 или более.

Определение:

some :: Alternative f =>  f  a ->  f [a] some v  =  some_v

where many_v = some_v  <|> pure  [] some_v =  (:) <$> v  <*>  many_v

Функция: many

Описание: функция для выбора альтернативы: 0 или более.

Определение:

many :: Alternative f =>  f  a ->  f [a] many v  =  many_v

where many_v = some_v  <|> pure  [] some_v =  (:) <$> v  <*>  many_v

Последние три  функции  используются в  синтаксических   анализаторах, для реализации которых впервые и был сделан этот модуль.

Остаётся отметить, что  за этот модуль в поставке  языка  Haskell отвечает Р.  Патерсон, с которым  можно  связаться по  адресу электронной почты ross@soi.city.ac.uk.

Источник: Душкин Р. В., Справочник по языку Haskell. М.: ДМК Пресс, 2008. 544 с., ил.

По теме:

  • Комментарии