Unknown - haskell-notes

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

• В прошлой главе у нас было упражнение о потоках. Сделайте поток экземпляром класса Num. Для этого

поток должен содержать значения из класса Num. Методы из класса Numприменяются поэлементно. Так

сложение двух потоков будет выглядеть так:

(a1 :&a2 :&a3 :& ...) +(b1 :&b2 :&b3) ==

==

(a1 +b1 :&a2 +b2 :&a3 +b3 :& ...)

84 | Глава 5: Функции высшего порядка

• Определите приоритет инфиксной операции ( :&)

так чтобы вам было удобно использовать её в сочетании с арифметическими операциями.

• Рассмотрим такой тип:

data Sta b = St(a ->(b, Sta b))

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

применения:

ap :: Sta b ->[a] ->[b]

Она принимает ленту входящих значений и возвращает ленту выходов. Определите для этого

типа несоколько основных функций высшего порядка. Чтобы не возникало конфликта имён с

модулем Data.Functionмы не будем его импортировать. Вместо него мы импортируем модуль

Control.Category. Он содержит класс:

class Categorycat where

id

::cat a a

( .) ::cat b c ->cat a b ->cat a c

Если присмотреться к типам функций, можно понять, что тип-экземпляр cat принимает два параметра.

Совсем как тип функции (a ->b). Формально его можно записать в префиксной форме так ( ->) a b.

Получается, что тип cat это что-то вроде функции. Это некоторые сущности, у которых есть понятия

тождества и композиции.

Для обычных функций экземпляр класса Categoryуже определён. Но в этом модуле у нас есть ещё и

необычные функции, функции которые преобразуют ленты значений. Функции id и ( .) мы определим,

сделав наш тип Stэкземпляром класса Category. Также определите постоянный преобразователь. Он

на любой вход возвращает одно и то же число, и преобразователь, который будет накапливать сумму

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

const

::a -> Stb a

integral :: Numa => Sta a

• Перепишите с помощью fix несколько стандартных функций для списков. Например map, foldr, foldl,

zip, repeat, cycle, iterate.

Старайтесь найти наиболее краткое выражение, пользуйтесь функциями высшего порядка и частичным

применением. Например рассмотрим функцию repeat:

repeat ::a ->[a]

repeat a =a :repeat a

Запишем с fix:

repeat a =fix $\xs ->a :xs

Заметим, что мы можем избавиться от аргумента xs с помощью сечения:

repeat a =fix (a :)

Но мы можем пойти ещё дальше, если вспомним, что функция двух аргументов ( :) является функцией

от одного аргумента ( :) ::a ->([a] ->[a]), которая возвращает функцию одного аргумента:

repeat =fix .( :)

Смотрите в этом выражении мы составили композицию двух функций. Функция ( :) примет первый

аргумент и вернёт функцию, как раз то, что и нужно для fix.

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

Глава 6

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

Мы научились комбинировать функции наиболее общего типа a ->b. В этой главе мы посмотрим на

специальные функции и способы их комбинирования. Cпециальными функциями мы будем называть такие

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

вычислить значение или упасть, или функции, которые возвращают сразу несколько вариантов значений.

Для составления таких функций из простейших в Haskell предусмотрено несколько классов типов. Это функ-

торы и монады. Их мы и рассмотрим в этой главе.

6.1 Композиция функций

Центральной функцией этой главы будет функция композиции. Вспомним её определение для функций

общего типа:

( .) ::(b ->c) ->(a ->b) ->(a ->c)

f .g =\x ->f (g x)

Композиция двух функций f и g это такая функция, в которой мы сначала применяем g, а затем f. Для того

чтобы тип функции стал более наглядным, мы определим эту функцию немного по-другому. Мы поменяем

аргументы местами.

( >>) ::(a ->b) ->(b ->c) ->(a ->c)

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

Интервал:

Закладка:

Сделать

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

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


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

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

x