Unknown - haskell-notes

Здесь есть возможность читать онлайн «Unknown - haskell-notes» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Старинная литература, на английском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

haskell-notes: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «haskell-notes»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

haskell-notes — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «haskell-notes», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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

Класс Monoid

Как мы будем накапливать результат? Пока мы умеем лишь возвращать из функции пару значений. Одно

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

На помощь нам придёт класс Monoid, он определён в модуле Data.Monoid:

class Monoida where

mempty

::a

mappend ::a ->a ->a

В этом классе определено пустое значение mempty и бинарная функция соединения двух значений в одно.

Этот класс очень похож на класс Categoryи Kleisli. Там тоже было значение, которое ничего не делает и

операция составления нового значения из двух простейших значений. Даже свойства класса похожи:

mempty

‘mappend‘ f

=f

f

‘mappend‘ mempty

=f

f ‘mappend‘ (g ‘mappend‘ h) =

(f ‘mappend‘ g) ‘mappend‘ h

a

g

f

b

b

c

msg

msg

b

a

g

f

c

MsgG

++

MsgF ++ MsgG

MsgF

a

f*>g

c

msg

Рис. 6.11: Композиция функций-накопителей

Упражнения | 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 BTreea = BLista | BNodea ( BTreea) ( BTreea)

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

data Treea = Nodea [ Treea]

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

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

туру.

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

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

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

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

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

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

instance Kleislim => Monad

m where

instance Monad

m => Kelislim where

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

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

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

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

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

Глава 7

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

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

мощью монад и функторов мы можем комбинировать специальные функции вида (a ->m b) с другими

специальными функциями.

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

class Functorf where

fmap ::(a ->b) ->f a ->f b

class Functorf => Applicativef where

pure

::a ->f a

( <*>)

::f (a ->b) ->f a ->f b

class Monadm where

return

::a ->m a

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «haskell-notes»

Представляем Вашему вниманию похожие книги на «haskell-notes» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «haskell-notes»

Обсуждение, отзывы о книге «haskell-notes» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x