52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 105

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 105

мента:

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 нельзя изменять значения. Новые сложные значения описываются в терминах базовых значе-

ний. Но как же тогда мы сможем описать функцию с состоянием? Функцию, которая принимает на вход

значение, составляет результат на основе внутреннего состояния и значения аргумента и обновляет состоя-