Холомьев А. Учебник по Haskell. Хаскель книга


О Haskell по-человечески

О Haskell по-человечески  β

Читать
  • WWW
  • PDF
  • PDF
  • PDF
  • EPUB

издание 2.0

Практика

www.ohaskell.guide

Компилятор

Для программирования в Haskell нам понадобится компилятор. Мы будем пользоваться наиболее развитым компилятором – GHC. Лучше всего устанавливать его вместе с Haskell Platform:

http://hackage.haskell.org/platform/

Haskell Platform содержит стабильную версию компилятора и много хороших, проверенных временем библиотек. Если по каким-то причинам установить Haskell Platform не удалось. Не отчаивайтесь, можно загрузить компилятор с сайта GHC:

http://www.haskell.org/ghc/

И далее установить все необходимые библиотеки с Hackage с помощью cabal (устанавливается отдельно с http://www.haskell.org/cabal/).

Среда разработки

Для Haskell существует очень мало сред разработки. Обычно на Haskell программируют в каких-нибудь продвинутых текстовых редакторах (vim, Emacs, scite, kate, notepad++). Отметим всё же среду разработки Leksah (http://leksah.org/), она написана на Haskell и её можно установить с Hackage.

Если вы не хотите разбираться с новым текстовым редактором или средой разработки, и вам нужна лишь подсветка синтаксиса можно воспользоваться gedit. Пишем код в gedit, сохраняем, переключаемся на ghci, пробуем, обновляем, пробуем, при случае компилируем или собираем в пакет. Всё это можно делать и в gedit.

О Haskell написано много интересных книг и статей, но все они на английском. На русском языке выходит электронный журнал “Практика функционального программирования” (). Пока в нём доминируют два языка – это Erlang и Haskell.

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

Книги

  • Miran Lipovaa. Learn You A Haskell For A Great Good.

    Очень хорошая книга для начинающих, Haskell в картинках. Весёлая и познавательная книга

    http://learnyouahaskell.com/

  • Hal Daume III. Yet Another Haskell Tutorial.

    Ещё одна очень хорошая книга для начинающих. Без картинок, но всё по делу.

  • Paul Hudak. Haskell School of Expression.

    Книга, которая иллюстрирует основные принципы функционального программирования на примере Haskell. Главные достоинства – много текста об общих принципах и интересные приложения, картинки, музыка, анимация, управление роботами и всё это на Haskell.

  • Paul Hudak. Haskell School of Music.

    Пол Хьюдак увлекается не только Haskell, но и музыкой. Он написал книгу, которая целиком посвящена описанию музыки в Haskell:

    http://www.cs.yale.edu/homes/hudak/Papers/HSoM.pdf

    http://haskell.cs.yale.edu/

  • Bryan O’Sullivan, Don Stewart, John Goerzen. Real World Haskell.

    Очень полезная книга в помощь тем, кто хочет научиться писать настоящие, серьёзные программы. Авторы подробно изучают вопросы, связанные с применением Haskell на практике.

    http://book.realworldhaskell.org/

  • Готовится к выходу к книга Саймона Марлоу о параллельных вычислениях в Haskell. Обещает быть очень интересной, уже известно, что книга будет доступна в интернете.

Тематический сборник

Основы
  • John Hughes. Why Functional Programming Matters.

  • Paul Hudak, John Hughes, Simon Peyton Jones, Philip Wadler. A History of Haskell: Being Lazy With Class.

  • Mark P. Jones. Functional Programming with Overloading and Higher-Order Polymorphism.

  • Евгений Кирпичев. Элементы функциональных языков программирования, журнал Практика функционального программирования.

  • Simon Thompson. Programming It in Haskell.

  • Justin Bailey. Haskell Cheat Sheet.

Разработка программ сверху-вниз
  • Дмитрий Астапов. Давно не брал я в руки шашек, журнал Практика функционального программирования.
Функторы и монады
  • Conor McBride, Ross Paterson. Applicative programming with effects. Статья об аппликативных функторах.

  • Philip Wadler. The Essence of Functional Programming.

    Статья, в которой впервые зашла речь о применении монад в Haskell.

  • Tarmo Uustalu, Varmo Vene. The Essence of Dataflow Programming.

    Статья о комонадах, но есть много интересного и о монадах.

  • Bulat Ziganshin. Haskell I/O inside: Down the Rabbit’s Hole. Статья на HaskellWiki.

  • John Launchbury, Simon Peyton Jones. Lazy functional state threads.

    Статья о типе ST.

  • Simon Peyton Jones. Tackling the Awkward Squad: monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell.

Ленивые вычисления
  • Douglas McIlroy. Power Series, Power Serious.

  • Дмитрий Астапов. Реурсия+мемоизация=динамическое программирование, журнал Практика функционального программирования.

  • Сергей Зефиров. Лень бояться, журнал Практика функционального программирования.

  • Jerzy Karczmarczuk. Specific “scientific” data structures, and their processing.

Структурная рекурсия
  • Graham Hutton. A tutorial on the universality and expressiveness of fold

  • Jeremy Gibbons. Origami Programming.

  • Jeremy Gibbons, Geraint Jones. The Under-Appreciated Unfold.

Лямбда-исчисление и функциональное программирование
  • Шалак В.И. Шейнфинкель и комбинаторная логика.

  • Paul Hudak: Conception, Evolution, and Application of Functional Programming Languages.

    Длинная статья о развитии функциональных языков. Там есть главы о лямбда-исчислении.

  • Бенджамин Пирс. Типы в языках программирования.

    Большая книга о теории типов.

    http://newstar.rinet.ru/~goga/tapl/

  • Денис Москвин. Системы типизации лямбда-исчисления.

    Курс видео-лекций.

    http://www.lektorium.tv/course/?id=22797

  • John Harrison. Introduction to Functional Programming.

    Курс лекций по функциональному программированию, который читался в Университете Кэмбридж.

  • А. Филд, П. Харрисон, Функциональное программирование, Москва “Мир”, 1993.

    Большая книга для читателей, всерьёз заинтересовавшихся функциональным программированием. Прочитав её, вы сможете не только пользоваться ФП-языками но и написать такой язык самостоятельно.

  • Rinus Plasmeijer and Marko van Eekelen. Functional Programming and Parallel Graph Rewriting.

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

Теория категорий

Две очень хорошие книги для начинающих:

Статьи по категориальным типам:

  • Varmo Vene. Categorical Programming with Inductive and Coinductive Types. Phd-диссертация.

  • Erik Meijer, Graham Hutton. Bananas in Space: Extending Fold and Unfold to Exponential Types.

  • Martin Erwig. Categorical Programming with Abstract Data Types.

  • Martin Erwig. Metamorphic Programming: Structured Recursion for Abstract Data Types.

Практика
  • Conal Elliott. Denotational design with type class morphisms.

  • Johan Tibell. High Performance Haskell. Слайды с выступления.

  • Johan Tibel. Faster persistent data structures through hashing. Слайды с выступления.

  • Simon Marlow. Parallel and Concurrent Programming in Haskell.

  • Edward Z. Yang. Блог о Haskell в картинках. Много полезной информации о лени и устройстве ghc. http://blog.ezyang.com/about/

  • Oleg Kiselyov. Блог в том числе и о Haskell. Много решений интересных и нетривиальных задач. http://okmij.org/ftp/

Как работает GHC
  • Документация GHC:

    http://hackage.haskell.org/trac/ghc/wiki/Commentary

  • Don Stewart. Multi-paradigm Just-In-Time Compilation. BS Thesis, 2002.

    Автор пробует компилировать Haskell-код в Java-код. При этом очень доступно объясняются внутренности STG.

  • Simon Marlow, Simon Peyton Jones. The Glasgow Haskell Compiler. The Architecture of Open Source Application, Volume 2, 2012.

  • Simon Marlow, Simon Peyton Jones. Making a Fast Curry: Push/Enter vs. Eval/Apply for Higher-order Languages. ICFP’04.

  • Simon Peyton Jones. Implementing lazy functional languages on stock hardware: the Spineless Tagless G-machine.

  • Simon Marlow, Tim Harris, Roshan P. James, Simon Peyton Jones. Parallel Generational-Copying Garbage Collection with a Block-Structured Heap. ISMM’08.

  • Simon Peyton Jones, Andre Santos. A transformation-based optimizer for Haskell. Science of computer programming, 1998.

  • Simon Peyton Jones, John Launchbury. Unboxed values as first citizens in a non-strict functional programming language. 1991.

  • Simon Marlow, Simon Peyton Jones. Secrets of Glasgow Haskell Compiler inliner. 1999

    Статья о тонкостях реализации прагмы INLINE.

  • Simon Peyton Jones, Andrew Tolmach, Tony Hoare. Playing by the Rules, ICFP 2001

    Статья о прагме RULES.

Встроенные проблемно-ориентированные языки (EDSL)
  • Oleg Kiselyov. Implementing Explicit and Finding Implicit Sharing in EDSLs.

    Чистое решение проблемы поиска дублирующих подвыражений.

  • Andy Gill. Type-Safe Observable Sharing in Haskell.

    Решение проблемы поиска дублирующих подвыражений с помощью расширения GHC, позволяющего проводить сравнение термов по указателям.

  • Conal Elliott, Sigbjorn Finne, Oege de Moor. Compiling Embedded Languages.

    Отчёт о построении EDSL для анимации.

  • Bruno C.d.S. Oliveira, Andres Loh. Abstract Syntax Graphs for Domain Specific Languages.

    Применение графов для кодирования дублирующих подвыражений в EDSL.

  • Jacques Carette, Oleg Kiselyov and Chung-chieh Shan. Finally Tagless, Partially Evaluated. Tagless Staged Interpreters for Simpler Typed Languages.

    Построение расширяемого синтаксиса с помощью классов типов.

  • Wouter Sweistra. Data types a la carte.

    Построение расширяемых типов. В этой статье и выше под словом “расширяемый” понимается возможность добавления к типу новых конструкторов без перекомпиляции старых.

И все-все-все

Если вдруг у вас возникли вопросы по Haskell, и рядом с вами не оказалось того, кто мог бы на них ответить, и в книгах нет ответа, вы можете спросить у сообщества Haskell, в haskell-cafe, там вам быстро и с радостью ответят:

http://www.haskell.org/mailman/listinfo/haskell-cafe

Сообщество Haskell славится радушием и терпимостью к начинающим. Там много информации о выпусках новых библиотек, конференциях, обучающих программах и просто разговоры о том-о-сём.

Также стоит отметить журнал Monad.Reader:

http://themonadreader.wordpress.com/

Число пакетов, загруженных на Hackage, уже перевалило за 2000. В Hackage легко заблудиться. Очень часто не разберёшься какой из пакетов выбрать. К тому же многие из них заброшены или просто не подходят для использования в серьёзных приложениях. Но среди них есть и очень хорошие пакеты. Некоторые из них включены в Haskell Platform. Ниже приведён тематический обзор наиболее популярных пакетов.

Стандартные библиотеки

Все приведённые в этом подразделе библиотеки включены в Haskell Platform.

Полный список библиотек для Haskell Platform можно посмотреть на сайте http://lambda.haskell.org/hp-tmp/docs.

  • Начало-всех-начал: base

    Библиотека включает в себя все стандартные определения, например модули Prelude, Data.List, Control.Monad и многие другие.

  • Стандартные монады: transformers, mtl

    Включает монады State, Writer, Reader и другие.

  • Контейнеры: containers

    Ассоциативные массивы, множества, последовательности, деревья.

  • Массивы: array

  • Графы: fgl

  • Архиваторы: zlib

  • Вычисление по значению: deepseq

    Обычная функция seq, позволяет привести данное выражение к слабой заголовочной нормальной форме, если нам всё же необходимо вычислить значение полностью, мы можем воспользоваться функцией deepseq из одноимённой библиотеки.

  • Параллельное программирование: stm и parallel

  • Временная арифметика, календарь: time

  • Парсинг: parsec

  • Регулярные выражения: regex-base, regex-posix

  • Построение структурированного текста: pretty

  • Тестирование программ: HUnit, QuickCheck

  • Управление файловой системой: directory

  • Работа с путями к файлам/директориям: filepath

  • Сетевые библиотеки: network, HTTP, cgi.

  • 3д Графика: OpenGL, GLUT.

  • Монадные трансформеры: transformers

    Мы не коснулись этой темы, но вот краткое пояснение: монадные трансформеры позволяют комбинировать несколько монад. Например, если нам нужно использовать чтение-запись в файл совместно с изменяемым состоянием.

Эффективные типы данных

  • Списки: dlist – эффективное объединение списков.

    Если вы часто пользуетесь операцией ++, то необходимо заботиться о том, чтобы скобки всегда группировались вправо. Как в a++(b++(c++d)). Иначе время объединения из линейного превратится в квадратичное. Библиотека dlist предоставляет специальный тип списков, для которых не важно как группируются скобки при объединении. Время объединения всегда будет линейным.

  • Строки: bytestring

    Если ваша программа загружена обработкой строк, и работает слишком медленно, рассмотрите вариант перехода со стандартных строк на тип ByteString, это может увеличить быстродействие на порядок.

  • Текст: text или utf8-string

    Работа с текстом в формате Unicode. Часто проблемы возникают при необходимости обработки русского текста закодированного в Unicode. Для решения этой проблемы можно воспользоваться одной из этих библиотек.

  • Двоичные данные: binary или cereal – Сериализация/десериализация данных.

  • Случайные числа: mersenne-random-pure64

    Эффективный генератор случайных чисел.

  • Ввод-вывод: iteratee

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

  • Контейнеры: unordered-containers

    Альтернатива стандартной библиотеке containers. Эффективные типы Map и Set.

  • Последовательности: fingertree, seq

    Используются для работы с очередями различного типа.

  • Массивы: vector

    Эффективный тип для представления массивов. Замена стандартному типу Data.Array.

  • Самые эффективные изменяемые хэш-таблицы: hashtables

  • Матрицы: hmatrix, repa

Разработка программ

  • Тестирование, проверка инвариантов: QuickCheck

  • Оценка быстродействия: criterion

  • Просмотр Core в человеческом виде: ghc-core

  • Настройка сборки мусора: ghc-gc-tune

  • Трассировка программ: hat

И все-все-все

  • Парсинг: parsec или attoparsec

  • Языки разметки: pandoc, xhtml, tagsoup, blaze-html, html

  • XML: xml, HaXml

  • JSON: json, aeson

  • Web: happstack, snap, yesod, hakyll

  • Сетевые библиотеки: network, HTTP, cgi, curl

  • Графика: diagrams, gnuplot, SDL

  • 3д графика: OpenGL, GLFW, GLUT

  • Базы данных: HDBC

  • Встраиваемые приложения реального времени с жёсткими ограничениями: atom

  • GUI: wxHaskell, gtk2hs

  • Оценка производительности программ: criterion

  • Статистика: statistics

  • Парсинг и генерация кода Haskell: haskell-src-exts

  • FRP: reactive, reactive-banana, yampa

  • Линейная алгебра: vector-space, hmatrix

Где культивируется Haskell?

Университеты

Посмотрим на университеты, в которых Haskell преподают, развивают и применяют:

  • Британия: Эдинбург, Ноттингем, Оксфорд (лаборатория информатики), Глазго.

  • Америка: Йельский, Коннектикут, Техас, Оклахома, Портлэнд, Канзас

  • Нидерланды: Утрехт

  • Швеция: Технологический Чалмерса, Гёттинген.

  • Австралия: Новый Южный Уэльс, Западной Австралии

  • и другие, полный список на http://www.haskell.org/haskellwiki/Haskell_in_education.

Компании

  • Microsoft Research – разрабатывают GHC.

  • Galios – ведут исследования и решают практические задачи на ФП-языках, особенно на Haskell.

  • Well-Typed – решают практические задачи, консультируют и всё на Haskell. Также занимаются организацией Haskell-слётов, поддержкой стандартных библиотек.

  • и другие, полный список на http://www.haskell.org/haskellwiki/Haskell_in_industry

anton-k.github.io

Учебник по Haskell читать онлайн, Холомьёв Антон

Учебник по Haskell

Антон Холомьёв

Книга зарегистрирована под лицензией Creative Commons Attribution-NonCommercial-NoDerivs

3.0 Generic license (CC BY-NC-ND 3.0), 2012 год. Вы можете свободно распространять и копировать

эту книгу при условии указания автора. Вы не можете использовать эту книгу в коммерческих

целях, вы не можете изменять содержание книги при копировании или создавать производные

работы на основе содержания этой книги, конечно если это не программный код :) Любое из

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

Обратная связь: [email protected]

Оглавление

Предисловие

5

1 Основы

7

2 Первая программа

19

3 Типы

34

4 Декларативный и композиционный стиль

53

5 Функции высшего порядка

66

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

80

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

99

8 IO

120

9 Редукция выражений

136

10 Реализация Haskell в GHC

149

11 Ленивые чудеса

175

12 Структурная рекурсия

186

13 Поиграем

195

14 Лямбда-исчисление

210

15 Теория категорий

221

16 Категориальные типы

234

17 Дополнительные возможности

245

18 Средства разработки

259

19 Ориентируемся по карте

269

20 Императивное программирование

282

21 Музыкальный пример

299

Приложения

312

3

Содержание

Предисловие

5

Структура книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

Основные понятия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

1 Основы

7

1.1 Общая картина . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7

1.2 Типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8

1.3 Значения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

1.4 Классы типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Контекст классов типов. Суперклассы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

1.5 Экземпляры классов типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

1.6 Ядро Haskell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

1.7 Двумерный синтаксис . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

1.8 Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

1.9 Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2 Первая программа

19

2.1 Интерпретатор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.2 У-вей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.3 Логические значения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2.4 Класс Show. Строки и символы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

Строки и символы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

Пример: Отображение дат и времени . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2.5 Автоматический вывод экземпляров классов типов . . . . . . . . . . . . . . . . . . . . . . . . 25

2.6 Арифметика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

Класс Eq. Сравнение на равенство . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Класс Num. Сложение и умножение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Класс Fractional. Деление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Стандартные числа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2.7 Документация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

2.8 Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

2.9 Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

3 Типы

34

3.1 Структура алгебраических типов данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

3.2 Структура констант . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

Несколько слов о теории графов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

Строчная запись деревьев . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

3.3 Структура функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

Композиция и частичное применение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

Декомпозиция и сопоставление с образцом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

3.4 Проверка типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Проверка типов с контекстом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

Ограничение мономорфизма . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

3.5 Рекурсивные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

3.6 Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

3.7 Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

4

4 Декларативный и композиционный стиль

53

4.1 Локальные переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

where-выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

let-выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

4.2 Декомпозиция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Сопоставление с образцом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

case-выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

4.3 Условные выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Охранные выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

if-выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

4.4 Определение функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Уравнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Безымянные функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

4.5 Какой стиль лучше? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

4.6 Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

4.7 Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

5 Функции высшего порядка

66

5.1 Обобщённые функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

Функция тождества . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

Константная функция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

Функция композиции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Аналогия с числами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...

knigogid.ru

Изучаем Haskell - Программирование - Учебники

Изучаем Haskell

Автор - Алехандро Серано Мена

Функциональное программирование становится все более и более популярным. Некоторые аспекты этой парадигмы заимствуют даже самые знаменитые языки, в том числе Java и C#, а Haskell, Scala, Clojure или OCaml, олицетворявшие функциональное программирование с самого начала, становятся все более и более востребованными. Haskell — это защищенный от побочных эффектов, чистый функциональный язык с давней историей, огромным количеством библиотек и активным сообществом. Все это превращает Haskell в отличный инструмент для изучения и внедрения функционального программирования.

Книга Алехандро Серано Мена "Изучаем Haskell" сконцентрирована как на идеях, положенных в основу Haskell-программирования, так и на его практических аспектах. В ней показано, как концепции функционального программирования применяются в реальных сценариях. Здесь вы научитесь работать с утилитами и библиотеками, предоставляемыми Haskell для решения конкретных задач. Однако выиграют от прочтения этой книги не только новички в функциональном программировании. Разработчики, пишущие на языке Scala, Clojure, Lisp или ML, смогут разобраться, что отличает Haskell от других языков программирования. Материал книги базируется на проекте создания витрины интернет-магазина.

В пяти частях этой книги описываются все подсистемы магазина: представление клиентов и товаров в памяти, получение данных (с использованием параллельных и одновременных вычислений), постоянное хранилище, скидки и предложения, общая архитектура приложения. Темы были тщательно отобраны, чтобы вы получили представление обо всей экосистеме Haskell.

Издательство – Питер

Год издания – 2015

Формат книги - PDF, DOC

Размер - 10,9 Мб

СКАЧАТЬ с depositfiles.com

Любители печатных изданий могут заказать бумажный экземпляр этой же книги здесь:

it-ebooks.ru

Об этой книге

В последние годы заметно возросло число книг, посвящённых Haskell, и это радует. Каждая из них преследует свою цель, поэтому трудно сказать, какая из них лучше. Цель этой книги двоякая.

Во-первых, я научу вас главному в Haskell. Основам, без освоения которых двигаться дальше никак не получится.

Во-вторых, я разрушу страх. Уже много лет вокруг Haskell витает дух страха, и я сполна ощутил его на себе. В действительности Haskell совсем не страшный, в нём нет чёрной магии, и чтобы программировать на нём, вам не нужна учёная степень. Более того, вы удивитесь, насколько просто в Haskell делать многие вещи, но эта простота откроется вам лишь после того, как вы близко познакомитесь с Тремя Китами Haskell, а также с госпожой Черепахой, поддерживающей оных. Имена этих Китов и Черепахи вы узнаете уже в следующей главе.

Эта книга не возведёт вас на вершины Haskell, но она откроет вам путь к этим вершинам.

Чего здесь нет

Трёх вещей вы не найдёте на страницах этой книги:

  1. Исчерпывающего справочника по Haskell. Дублировать официальное описание стандарта Haskell 2010 я не стану.
  2. Набора готовых рецептов. За рецептами пожалуйте на Stack Overflow.
  3. Введения в математическую теорию. Несмотря на то, что Haskell корнями своими уходит в математику, в этой книге нет погружения в теорию категорий и в иные теории. Извините, если разочаровал.

О первом и втором издании

На обложке вы видели метку «издание 2.0». Перед вами второе издание, полностью переработанное и переосмысленное. Вот две причины, побудившие меня переписать книгу.

Первая — мои ошибки. Я убеждён, что обучать языку программирования могут лишь те, кто использует этот язык в своей каждодневной работе. На момент написания первой версии я ещё не работал с Haskell, а потому многого не знал и не понимал. В результате часть информации из первого издания была откровенно бедна, а несколько глав вообще вводили читателя в заблуждение.

Вторая причина — изменившаяся цель книги. Я намеренно сузил круг рассматриваемых здесь тем. Теперь книга всецело посвящена основам языка, поэтому не ищите здесь рассмотрения специфических тем. Я не очень-то верю в идею book-all-in-one, книга для новичков должна быть книгой для новичков. Вы не встретите здесь ни примеров реализации 3D-движка, ни рассказа о работе с PostgreSQL, ни повествования о проектировании игры для Android. Всё это можно делать с Haskell, но подобным темам посвящены другие публикации, которые несомненно будут вам по плечу после прочтения моей книги.

Читайте последовательно

И это важно. В процессе чтения вы заметите, что я периодически поднимаю вопросы и как бы оставляю их без ответа. Это делается вполне осознанно: ответы обязательно будут даны, но в последующих главах, там, где это будет наиболее уместно. Поэтому перепрыгивание с главы на главу может вас запутать.

Впрочем, в веб-версии книги есть «Предметный указатель», который поможет вам быстро найти нужное место, что особенно полезно при повторном прочтении книги.

Для любопытных

В конце большинства глав вы найдёте небольшой раздел, который так и называется — «Для любопытных». Читать его необязательно, но любознательным непременно понравится. В этом разделе я привожу некоторые технические подробности, исторические сведения и просто интересные факты.

И учтите, пожалуйста: содержимое раздела «Для любопытных» иногда чуток ломает последовательность изложения материала, это сделано осознанно. Помня о многих вопросах читателей к главам из предыдущего издания, я вынес ответы на некоторые из этих вопросов в данный раздел, и поэтому оный, скажем, в 12 главе может ссылаться на материал, изложенный лишь в 16 главе. Если сомневаетесь — не читайте.

О пояснениях

Во многих примерах исходного кода вы увидите пояснения вот такого вида:

type String = [Char] тип этот равен тому

Такие пояснение следует читать слева направо и сверху вниз, и вы сразу поймёте что к чему. Каждая часть пояснения расположена строго под тем кусочком кода, к которому она относится.

Вот ещё один пример:

let (host, alias) = ("173.194.71.106", "www.google.com") данное значение это хост а вот это значение это имя

Здесь я говорю вам: «Данное значение — это хост, а вот это значение — это имя». В ряде случаев я использую также различного вида подчёркивание:

(host, alias) = ("173.194.71.106", "www.google.com") ____ ________________ ===== ================

Здесь я провожу параллель: «Значение host ассоциировано со строкой 173.194.71.106, а значение alias — со строкой www.google.com».

Благодарность

Эта книга — плод не только моих усилий. Многие члены нашего сообщества помогли мне советами, замечаниями и исправлениями. Большое спасибо вам, друзья!

А ещё я благодарю всех тех, кто создал Haskell, и всех тех, кто неустанно совершенствует его. Вашими усилиями наша про

www.ohaskell.guide

Холомьев А. Учебник по Haskell [PDF]

2012. — 365 с.: ил. В данном томе представлено новые 14 статей автора, которые в разное время были опубликованы в различных источниках — в научно-практическом журнале «Практика функционального программирования» (с дополнениями, которые не были включены в опубликованные статьи), на различных ресурсах в сети Интернет, на тематическом ресурсе Хаброхабр. Статьи сгруппированы в трёх...

  • 3,77 МБ
  • добавлен 10.12.2012 16:08
  • изменен 02.11.2016 03:55

Данная книга является первой книгой на русском языке, описывающей набор стандартных библиотек функционального языка программирования Haskell. В первой части книги кратко рассматривается синтаксис языка и способы его применения для решения задач. Во второй части описываются стандартные библиотеки языка, входящие в поставки всех современных трансляторов Haskell (GHC, HUGS и др. )....

  • 1,95 МБ
  • дата добавления неизвестна
  • изменен 22.08.2016 13:12

М.: ДМК Пресс, 2006. — 608 с. — ISBN 5 94074 335 8 Данная книга является первым в России изданием, рассматривающим функциональное программирование в полном объеме, достаточном для понимания новичку и для использования книги в качестве справочного пособия теми, кто уже использует парадигму функционального программирования в своей практике. Изучение прикладных основ показано на...

  • 2,85 МБ
  • добавлен 02.10.2012 21:00
  • изменен 17.08.2016 23:33

СПб.: Питер, 2015. — 464 с. — ISBN 978-5-496-01188-4. Эта книга поможет вам быстро освоить базовые концепции языка программирования Haskell, его библиотеки и компоненты, а также заложит основы функциональной парадигмы программирования, которая становится все более значимой в современном мире разработки ПО. Книга предлагает проектный подход к освоению материала, используя в...

  • 7,24 МБ
  • добавлен 12.05.2015 23:10
  • изменен 15.01.2018 09:14

МГИУ, 2007 - 215 с. Пособие знакомит с директивным стилем программирования, используя в качестве языка программирования Haskell, который сочетает черты чисто функционального языка с возможностями объектно-ориентированного стиля программирования. Изложение начинается с рассмотрения основ функционального программирования, продолжается изложением методов написания простейших...

  • 1,15 МБ
  • дата добавления неизвестна
  • изменен 26.03.2010 13:42

2014. — 157 с. О Haskell по-человечески для обыкновенных программистов. Признаюсь, я начал уставать от сложности C++. Захотелось мне чего-нибудь эдакого. Компилируемость, строгость к типам, высокоуровневые конструкции, красивый синтаксис, универсальность и. что-нибудь попроще. Да, я хотел именно этого. Под руку случайно подвернулся Haskell — и зацепил меня сразу. Во-первых,...

  • 1,69 МБ
  • добавлен 17.03.2014 11:17
  • изменен 17.05.2018 05:05

www.twirpx.com

Моя первая книга по Haskell

Так уж вышло, что первой книгой по Haskell, которую я приобрёл в печатном виде, стал именно «справочник» Романа Душкина, обложку которого вы видите слева.

И каким бы ярым патриотом я ни был, к сожалению, не могу сказать ничего мегахорошего об этой книге. Всё-таки далеко пока что нашим авторам книг по IT-тематике до зарубежных :(

Прочитал книгу достаточно быстро, поэтому кратенько изложу достоинства и недостатки (субъективно, естественно).

Достоинства:

  • В первую очередь это, конечно же, русский язык. Как ни крути, а книг по Haskell на русском практически нет, а ведь приятно всё-таки читать на родном.
  • Всё собрано в одном месте. (Иногда очень лень шариться по сайтам в поисках нужной инфы, а тут всё «как на ладони»).
  • Информация достаточно хорошо структурирована, что позволяет производить быстрый поиск :)
  • Список литературы в конце книги достаточно интересен. Следует ознакомиться.

Недостатки:

  • Русский язык — это хорошо конечно, но IMHO в данной книге он суховат. Да и вообще книга позиционируется, как удобное руководство для начинающих в том числе. Вот я начинающий, и не знаю я, что такое β-редукция и η-преобразования, ну не знаю! Впрочем, аналогичная проблема с обилием терминов даже в русской Википедии прослеживается (в сравнении с английской). Наверное, особенность менталитета.
  • Неоднократно встречал фразы типа «объём данной книги не позволяет вставить разъяснения того-то и того-то». Читайте, мол, документацию. Ну так с таким успехом вместо книги можно было сделать лист А4 со списком ссылок…
  • В целом я считаю, что книга своих денег не стоит. Не знаю, правда, какова её изначальная стоимость, но пока она добралась до Украины, её цена солидно прибавила в размерах.

Таким образом, покупать эту книгу или нет, дело, конечно, ваше. Я не жалею, что приобрёл её (всё-таки первая в коллекции), но и сильной радости не испытываю. Буду копить на «Real World Haskell» ;)

blog.olendarenko.org.ua