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

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

Упражнения | 103

Первые два свойства говорят о том, что значение mempty и вправду является пустым элементом отно-

сительно операции mappend. А третье свойство говорит о том, что порядок при объединении элементов не

важен.

Посмотрим на определение экземпляра для списков:

instance Monoid [a] where

mempty

= []

mappend = (++)

Итак пустой элемент это пустой список, а объединение это операция конкатенации списков. Проверим в

интерпретаторе:

*Kleisli> :m Data.Monoid

Prelude Data.Monoid> [1 .. 4] ‘mappend‘ [4, 3 .. 1]

[1,2,3,4,4,3,2,1]

Prelude Data.Monoid> ”Hello” ‘mappend‘ ” World” ‘mappend‘ mempty

”Hello World”

Напишите экземпляр класса Kleisli для функций накопителей по (рис. 6.11). При этом будем считать,

что тип msg является экземпляром класса Monoid.

Экземпляры для функторов и монад

Представьте, что у нас нет класса Kleisli, а есть лишь Functor, Applicative и Monad. Напишите экзем-

пляры для этих классов для всех рассмотренных в этой главе специальных функций (в том числе и для Reader

и Writer). Экземпляры Functor и Applicative могут быть определены через Monad. Но для тренировки опре-

делите экземпляры полностью. Сначала Functor, затем Applicative и в последнюю очередь Monad.

Деревья

Напишите экземпляры классов Kleisli и Monad для двух типов, которые описывают деревья. Бинарные

деревья:

data BTree a = BList a | BNode a (BTree a) (BTree a)

Деревья с несколькими узлами:

data Tree a = Node a [Tree a]

Считайте, что списки являются частными случаями деревьев. В этом смысле деревья будут описывать

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

туру.

Стандартные функции

Почитайте документацию к модулям Control.Monad и Control.Applicative. Присмотритесь к функциям,

попробуйте применить их в интерпретаторе.

Эквивалентность классов Kleisli и Monad

Покажите, что классы Kleisli и Monad эквивалентны. Для этого нужно для произвольного типа c с одним

параметром m определить два экземпляра:

instance Kleisli m => Monad

m where

instance Monad

m => Kelisli m where

Нужно определить экземпляр одного класса с помощью методов другого.

Свойства класса Monad

Если класс Monad эквивалентен Kleisli, то в нём должны выполнятся точно такие же свойства. Запишите

свойства класса Kleisli через методы класса Monad

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

Глава 7

Функторы и монады: примеры

В этой главе мы закрепим на примерах то, что мы узнали о монадах и функторах. Напомню, что с по-