52700.fb2
class Functor f where
fmap :: (a -> b) -> f a -> f b
С помощью класса Applicative можно применять специальные значения к обычным функциям любого
числа аргументов:
class Functor f => Applicative f where
pure
:: a -> f a
<*>
:: f (a -> b) -> f a -> f b
liftA
:: Applicative f => (a -> b) -> f a -> f b
liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c
liftA3 :: Applicative f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d
...
С помощью класса Monad можно применять специальные значения к специальным функциям.
class Monad m where
return
:: a -> m a
(>>=)
:: m a -> (a -> m b) -> m b
Функция return является функцией id в мире специальных функций, а функция >>= является функцией
применения ($), с обратным порядком следования аргументов. Вспомним также класс Kleisli, на примере
котором мы узнали много нового из жизни специальных функций:
class Kleisli m where
idK
:: a -> m a
(*> )
:: (a -> m b) -> (b -> m c) -> (a -> m c)
Мы узнали несколько стандартных специальных функций:
Частично определённые функции
a -> Maybe b
data Maybe a = Nothing | Just a
Многозначные функции
a -> [b]
data [a] = [] | a : [a]
6.6 Упражнения
В первых упражнениях вам предлагается по картинке специальной функции написать экземпляр классов
Kleisli и Monad.
Функции с состоянием
b
a
f
s
s
Рис. 6.6: Функция с состоянием
100 | Глава 6: Функторы и монады: теория
В Haskell нельзя изменять значения. Новые сложные значения описываются в терминах базовых значе-
ний. Но как же тогда мы сможем описать функцию с состоянием? Функцию, которая принимает на вход
значение, составляет результат на основе внутреннего состояния и значения аргумента и обновляет состоя-