52700.fb2
Первое свойство говорит о том, что применение специальной функции одного аргумента совпадает с
методом fmap из класса Functor. Свойство тождества идентично аналогичному свойству для класса Functor.
Свойство композиции сформулировано хитро, но давайте посмотрим на типы аргументов:
(. ) :: (b -> c) -> (a -> b) -> (a -> c)
f
:: m (b -> c)
g
:: m (a -> b)
x
:: m a
liftA3 (. ) f g x :: m c
g <*> x
:: m b
f (g <*> x)
:: m c
Слева в свойстве стоит liftA3, а не liftA2, потому что мы сначала применяем композицию (. ) к двум
функциям f и g, а затем применяем составную функцию к значению x.
Последнее свойство говорит о том, что если мы возьмём обычную функцию и обычное значение и подни-
мем их в мир специальных значений с помощью lift и pure, то это тоже самое если бы мы просто применили
бы функцию f к значению в мире обычных значений и затем подняли бы результат в мир специальных зна-
чений.
Полное определение классов
На самом деле я немного схитрил. Я рассказал вам только об основных методах классов Applicative
и Monad. Но они содержат ещё несколько дополнительных методов, которые выражаются через остальные.
Посмотрим на них, начнём с класса Applicative.
class Functor f => Applicative f where
-- | Поднимаем значение в мир специальных значений.
pure :: a -> f a
-- | Применение специального значения-функции.
(<*> ) :: f (a -> b) -> f a -> f b
-- | Константная функция. Отбрасываем первое значение.
98 | Глава 6: Функторы и монады: теория
(*> ) :: f a -> f b -> f b
(*> ) = liftA2 (const id)
-- | Константная функция, Отбрасываем второе значение.
(<*) :: f a -> f b -> f a
(<*) = liftA2 const
Два новых метода (*> ) и (<*) имеют смысл константных функций. Первая функция игнорирует значение
слева, а вторая функция игнорирует значение справа. Посмотрим как они работают в интерпретаторе:
Prelude Control.Applicative> Just 2 *> Just 3
Just 3
Prelude Control.Applicative> Nothing *> Just 3
Nothing
Prelude Control.Applicative> (const id) Nothing
Just 3
Just 3
Prelude Control.Applicative> [1,2] <* [1,2,3]
[1,1,1,2,2,2]
Значение игнорируется, но способ комбинирования специальных функций учитывается. Так во втором