О Haskell по-человечески издание 2.0 ДенисШевченко www.ohaskell.guide 2016 КнигасвободнораспространяетсянаусловияхлицензииCCBY-NC4.0 © ДенисШевченко,2014-2016 Оглавление 1 Приветствую! 9 Почемуэтакнигапоявилась . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Цель . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Осебе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Овас . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Обещание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2 Первыевопросы 11 «ЧтотакоеэтотвашHaskell?» . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 «Эточто,какой-тоновыйязык?» . . . . . . . . . . . . . . . . . . . . . . . . . 11 «Иктоегосделал?» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 «АбиблиотекидляHaskellимеются?» . . . . . . . . . . . . . . . . . . . . . . 12 «Ичто,егоужеможновproduction?» . . . . . . . . . . . . . . . . . . . . . . 12 «АпорогвхождениявHaskellвысокий?» . . . . . . . . . . . . . . . . . . . . 12 «Аяслышалещёпрокакие-томонады…» . . . . . . . . . . . . . . . . . . . 12 «АеслисравнитьегосC++/Python/Scala…» . . . . . . . . . . . . . . . . . . . 12 3 Обэтойкниге 13 Чегоздесьнет . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Опервомивторомиздании . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Читайтепоследовательно . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Длялюбопытных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Опояснениях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4 Благодарность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Словокчитавшимпервоеиздание . . . . . . . . . . . . . . . . . . . . . . . . 15 4 Приготовимся 17 Устанавливаем . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Разворачиваеминфраструктуру . . . . . . . . . . . . . . . . . . . . . . . . . 18 HiWorld. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Модули:знакомство . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Длялюбопытных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 5 КитыиЧерепаха 22 Черепаха . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 ПервыйКит . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 ВторойКит . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 ТретийКит . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Длялюбопытных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 6 Неизменностьичистота 28 Объявляемиопределяем . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Чистофункциональный . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 «Присваивание?Не,неслышал…» . . . . . . . . . . . . . . . . . . . . . . . . 30 Длялюбопытных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 7 Выбираемивозвращаемся 33 Выглянемвовнешниймир . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Выборивыход . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Длялюбопытных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 8 Выбориобразцы 38 Нетолькоиздвух . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 БезЕсли . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Сравнениесобразцом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 9 Пустьбудеттам,Где… 44 Пусть . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Где . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Вместе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 10 Мироператоров 49 Зачемэтонужно? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 11 Список 52 Типсписка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Действиянадсписками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Неизменностьсписка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Перечисление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Длялюбопытных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 12 Кортеж 60 Типкортежа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Действиянадкортежами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Невсё . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 Аеслиошиблись? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Длялюбопытных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 13 Лямбда-функция 68 Истоки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Строение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Типфункции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Локальныефункции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Длялюбопытных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 14 Композицияфункций 75 Скобкам—бой! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Композицияиприменение . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Длинныецепочки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Какработаеткомпозиция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 15 ФВП 82 Отображение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Частичноеприменение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Композициядляотображения . . . . . . . . . . . . . . . . . . . . . . . . . . 88 16 Hackageибиблиотеки 90 Библиотекибольшиеималенькие . . . . . . . . . . . . . . . . . . . . . . . . 90 Hackage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 Иерархиявимени. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Лицо . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Импортируемпо-разному . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Оформление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 17 Рекурсия 98 Цикл . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Правдаосписке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Тудаиобратно . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Длялюбопытных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 18 Лень 104 Двемоделивычислений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 Какможноменьше . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Рациональность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 Бесконечность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Spaceleak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Борьба . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Леньистрогостьвместе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Длялюбопытных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 19 Нашитипы 119 Знакомство . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 Значение-пустышка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 20 АТД 123 Извлекаемзначение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Строим . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 21 АТД:полясметками 128 Метки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 GetterиSetter?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Безметок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 22 Новыйтип 135 Различия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Зачемоннужен? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 typevsnewtype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 23 Конструктортипа 140 Опциональныйтип . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Можетбыть . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Этажи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 24 Продолжениеследует… 147 Глава 1 Приветствую! Передвами—книгаоHaskell,удивительномипрекрасномязыкепрограммирова- ния. Почему эта книга появилась Потомучтоменяоткровеннодостало.ПочтивсеизвестныемнекнигиоHaskellна- чинаютсяспримерареализациибыстройсортировкии—кудажбезнеё!—после- довательности Фибоначчи. Эта книга не такая: минимум академизма, максимум практичности. Цель Функциональное программирование — своеобразное гетто посреди мегаполиса нашей индустрии. Доля функциональных языков пока ещё очень мала, и многие разработчики побаиваются знакомства с этими языками, и с Haskell в особенно- сти. Моя цель — разрушить этот страх. Вероятно, вы слышали, что Haskell — это что-тоархисложное,сугубонаучноеинепригодноедляреальнойжизни?Читайте дальше,ивскоревыубедитесьвобратном. О себе Обыкновенный программист-самоучка. Разрабатываю с 2006 года. В 2012 году впервыеуслышалпроHaskell,ужаснулсяипоспешилонёмзабыть.В2013вспом- нилопять,в2014увлёксявсерьёз,ав2015,после8летжизнисC++,окончательно перешёл в Haskell-мир. Также я положил начало русскоязычному сообществу Haskell-разработчиков. И да, я действительно использую этот язык в своей каждодневнойработе. 9 Глава1. Приветствую! 10 О вас Знаете, что такое компилятор? Не боитесь командной строки? Слышали слово «функция»? Если да — смело продолжайте читать, никаких дополнительных навыков от вас не ожидается. И какой-либо математической подготовки — тоже. Обещание Возможно,выпоушивлюбитесьвHaskell.Возможно,онвызоветувасотвращение. Обещаюодно—скучнонебудет.Начнём.