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

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

b

env

Рис. 6.8: Функция с окружением

Функции с окружением

Сначала мы рассмотрим функции с окружением. Функции с окружением – это такие функции, у которых

есть некоторое хранилище данных или окружение, из которых они могут читать информацию. Но в отличие

от функций с состоянием они не могут это окружение изменять. Функция с окружением похожа на функцию

с состоянием без одного выхода для состояния (рис. 6.8).

Функция с окружением принимает аргумент a и окружение env и возвращает результат b:

a -> env -> b

Как и в случае функций с состоянием выделим для функции с окружением отдельный тип. В Haskell он на-

зывается Reader (от англ. чтец). Все функции с окружением имеют возможность читать из общего хранилища

данных. Например они могут иметь доступ на чтение к общей базе данных.

data Reader env b = Reader (env -> b)

runReader :: Reader env b -> (env -> b)

runReader (Reader f) = f

Теперь функция с окружением примет вид:

a -> Reader env b

Определите для функций с окружением экземпляр класса Kleisli. У нас возникнет цепочка функций,

каждая из которых будет нуждаться в значении окружения. Поскольку окружение общее для всех функций

мы всем функциям передадим одно и то же значение (рис. 6.9).

a

f

b

b

g

c

env

env

b

a

g

f

c

env

a

f*>g

c

env

Рис. 6.9: Функция с окружением

Функции-накопители

Функции-накопители при вычислении за ширмой накапливают некоторое значение. Функция-накопитель

похожа на функцию с состоянием но без стрелки, по которой состояние подаётся в функцию (рис. 6.10).

Функция-накопитель имеет тип: a -> (b, msg)

Выделим результат функции в отдельный тип с именем Writer.

102 | Глава 6: Функторы и монады: теория

a

f

b

Msg