Миран Липовача - Изучай Haskell во имя добра!
- Название:Изучай Haskell во имя добра!
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2012
- Город:Москва
- ISBN:978-5-94074-749-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Миран Липовача - Изучай Haskell во имя добра! краткое содержание
Язык Haskell имеет множество впечатляющих возможностей, но главное его свойство в том, что меняется не только способ написания кода, но и сам способ размышления о проблемах и возможных решениях. Этим Haskell действительно отличается от большинства языков программирования. С его помощью мир можно представить и описать нестандартным образом. И поскольку Haskell предлагает совершенно новые способы размышления о проблемах, изучение этого языка может изменить и стиль программирования на всех прочих.
Ещё одно необычное свойство Haskell состоит в том, что в этом языке придаётся особое значение рассуждениям о типах данных. Как следствие, вы помещаете больше внимания и меньше кода в ваши программы.
Вне зависимости от того, в каком направлении вы намерены двигаться, путешествуя в мире программирования, небольшой заход в страну Haskell себя оправдает. А если вы решите там остаться, то наверняка найдёте чем заняться и чему поучиться!
Эта книга поможет многим читателям найти свой путь к Haskell.
Отображения, монады, моноиды и другое! Всё сказано в названии: «Изучай Хаскель во имя добра!» – весёлый иллюстрированный самоучитель по этому сложному функциональному языку.
С помощью оригинальных рисунков автора, отсылке к поп-культуре, и, самое главное, благодаря полезным примерам кода, эта книга обучает основам функционального программирования так, как вы никогда не смогли бы себе представить.
Вы начнете изучение с простого материала: основы синтаксиса, рекурсия, типы и классы типов. Затем, когда вы преуспеете в основах, начнется настоящий мастер-класс от профессионала: вы изучите, как использовать аппликативные функторы, монады, застежки, и другие легендарные конструкции Хаскеля, о которых вы читали только в сказках.
Продираясь сквозь образные (и порой безумные) примеры автора, вы научитесь:
• Смеяться в лицо побочным эффектам, поскольку вы овладеете техниками чистого функционального программирования.
• Использовать волшебство «ленивости» Хаскеля для игры с бесконечными наборами данных.
• Организовывать свои программы, создавая собственные типы, классы типов и модули.
• Использовать элегантную систему ввода-вывода Хаскеля, чтобы делиться гениальностью ваших программ с окружающим миром.
Нет лучшего способа изучить этот мощный язык, чем чтение «Изучай Хаскель во имя добра!», кроме, разве что, поедания мозга его создателей. Миран Липовача (Miran Lipovača) изучает информатику в Любляне (Словения). Помимо его любви к Хаскелю, ему нравится заниматься боксом, играть на бас-гитаре и, конечно же, рисовать. У него есть увлечение танцующими скелетами и числом 71, а когда он проходит через автоматические двери, он притворяется, что на самом деле открывает их силой своей мысли.
Изучай Haskell во имя добра! - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
У функций тоже есть типы. Когда мы пишем свои собственные функции, то можем указывать их тип явно. Обычно это считается нормой, исключая случаи написания очень коротких функций. Здесь и далее мы будем декларировать типы для всех создаваемых нами функций.
Помните генератор списка, который мы использовали ранее: он фильтровал строку так, что оставались только прописные буквы? Вот как это выглядит с объявлением типа:
removeNonUppercase :: [Char] –> [Char]
removeNonUppercase st = [ c | c <���– st, c `elem` ['А'..'Я']]
Функция removeNonUppercase
имеет тип [Char] –> [Char]
. Эта запись означает, что функция принимает одну строку в качестве параметра и возвращает другую в качестве результата.
А как записать тип функции, которая принимает несколько параметров? Вот, например, простая функция, принимающая три целых числа и складывающая их:
addThree :: Int –> Int –> Int –> Int
addThree x y z = x + y + z
Параметры разделены символами –>, и здесь нет никакого различия между параметрами и типом возвращаемого значения. Возвращаемый тип – это последний элемент в объявлении, а параметры – первые три.
Позже мы увидим, почему они просто разделяются с помощью символов –>
, вместо того чтобы тип возвращаемого значения как-то специально отделялся от типов параметров (например, Int, Int, Int –> Int
или что-то в этом духе).
Если вы хотите объявить тип вашей функции, но не уверены, каким он должен быть, то всегда можно написать функцию без него, а затем проверить тип с помощью :t
. Функции – тоже выражения, так что :t
будет работать с ними без проблем.
Обычные типы в языке Haskell
А вот обзор некоторых часто используемых типов.
• Тип Int
обозначает целое число. Число 7 может быть типа Int
, но 7.2 – нет. Тип Int
ограничен: у него есть минимальное и максимальное значения. Обычно на 32-битных машинах максимально возможное значение типа Int
– это 2 147 483 647, а минимально возможное – соответственно, –2 147 483 648.
ПРИМЕЧАНИЕ.Мы используем компилятор GHC, в котором множество возможных значений типа Int определено размером машинного слова на используемом компьютере. Так что если у вас 64-битный процессор, вполне вероятно, что наименьшим значением типа Int будет –2 63, а наибольшим 2 63–1.
• Тип Integer
обозначает… э-э-э… тоже целое число. Основная разница в том, что он не имеет ограничения, поэтому может представлять большие числа. Я имею в виду – очень большие. Между тем тип Int
более эффективен. В качестве примера сохраните следующую функцию в файл:
factorial :: Integer –> Integer
factorial n = product [1..n]
Затем загрузите этот файл в GHCi с помощью команды :l
и проверьте её:
ghci> factorial 50
30414093201713378043612608166064768844377641568960512000000000000
• Тип Float
– это действительное число с плавающей точкой одинарной точности. Добавьте в файл ещё одну функцию:
circumference :: Float –> Float
circumference r = 2 * pi * r
Загрузите дополненный файл и запустите новую функцию:
ghci> circumference 4.0
25.132742
• Тип Double
– это действительное число с плавающей точкой двойной точности. Двойная точность означает, что для представления чисел используется вдвое больше битов, поэтому дополнительная точность требует большего расхода памяти. Добавим в файл ещё одну функцию:
circumference' :: Double –> Double
circumference' r = 2 * pi * r
Загрузите дополненный файл и запустите новую функцию
ghci> circumference' 4.0
25.132741228718345
• Тип Bool
– булевский. Он может принимать только два значения: True
и False
.
• Тип Char
представляет символ Unicode. Его значения записываются в одинарных кавычках. Список символов является строкой.
• Кортежи – это типы, но тип кортежа зависит от его длины и от типа его компонентов. Так что теоретически количество типов кортежей бесконечно – а стало быть, перечислить их все в этой книге нет возможности. Заметьте, что пустой кортеж ()
– это тоже тип, который может содержать единственное значение: ()
.
Типовые переменные

Некоторые функции могут работать с данными разных типов. Например, функция head
принимает список и возвращает его первый элемент. При этом неважно, что именно этот список содержит – числа, символы или вообще другие списки. Функция должна работать со списками, что бы они ни содержали.
Как вы думаете, каков тип функции head
? Проверим, воспользовавшись командой :t
.
ghci> :t head
head :: [a] –> a
Гм-м! Что такое a
? Тип ли это? Мы уже отмечали, что все типы пишутся с большой буквы, так что это точно не может быть типом. В действительности это типовая переменная. Иначе говоря, a
может быть любым типом.
Подобные элементы напоминают «дженерики» в других языках – но только в Haskell они гораздо более мощные, так как позволяют нам легко писать самые общие функции (конечно, если эти функции не используют какие-нибудь специальные свойства конкретных типов).
Функции, в объявлении которых встречаются переменные типа, называются полиморфными . Объявление типа функции head
выше означает, что она принимает список любого типа и возвращает один элемент того же типа.
ПРИМЕЧАНИЕ.Несмотря на то что переменные типа могут иметь имена, состоящие более чем из одной буквы, мы обычно называем их a, b, c, d…
Помните функцию fst
? Она возвращает первый компонент в паре. Проверим её тип:
ghci> :t fst
fst :: (a, b) –> a
Можно заметить, что функция fst
принимает в качестве параметра кортеж, который состоит из двух компонентов, и возвращает значение того же типа, что и первый компонент пары. Поэтому мы можем применить функцию fst
к паре, которая содержит значения любых двух типов.
Заметьте, что хотя a
и b
– различные переменные типа, они вовсе не обязаны быть разного типа. Сигнатура функции fst
лишь означает, что тип первого компонента и тип возвращаемого значения одинаковы.
Классы типов

Класс типов – интерфейс, определяющий некоторое поведение. Если тип является экземпляром класса типов, то он поддерживает и реализует поведение, описанное классом типов. Более точно можно сказать, что класс типов определяет набор функций, и если мы решаем сделать тип экземпляром класса типов, то должны явно указать, что эти функции означают применительно к нашему типу.
Читать дальшеИнтервал:
Закладка: