Основы функционального программирования/Основы языка Haskell: различия между версиями
Содержимое удалено Содержимое добавлено
мНет описания правки |
|||
Строка 2:
{{ОФП Содержание}}
Настоящая лекция будет полностью посвящена синтаксису языка [[w:Haskell|Haskell]] (далее, для удобства, «Хаскел»). Будут рассмотрены все важнейшие понятия языка, их соотношение с
== Структуры данных и их типы ==
Строка 8:
Одна из основных единиц любого языка программирования — это символ. Символом традиционно называется последовательность букв, цифр и специальных знаков ограниченной или неограниченной длины. В некоторых языках строчные и прописные буквы различаются (к ним относится Хаскел), в некоторых нет (Лисп).
Символы чаще всего являются идентификаторами — именами констант, переменных, функций. Значениями же констант, переменных и функций являются типизированные последовательности знаков. Пример: значением числовой константы не может быть строка из букв. В функциональных языках есть понятие '''атом'''. В реализациях атомами называются символы и
[[w:Список (структура данных)|Список]] — ещё одно понятие функционального программирования. В абстрактной математической записи использовались квадратные скобки <code>[]</code>, которые также используются в Хаскеле. Но в Лиспе используются обычные, круглые скобки <code>()</code>. Элементы списка в Лиспе разделяются [[w:пробел|пробелами]], что не очень наглядно, поэтому в Хаскеле ввели запятую для разделения. Список <code>[a, b, c]</code> будет правильно записан в синтаксисе Хаскела, а в нотацию Лиспа его необходимо перевести как <code>(a b c)</code>. Создатели Лиспа пошли ещё дальше в своей изощрённости: допускается использовать точечную запись для организации пары, поэтому приведённый выше список можно записать как <code>(a.(b.(c.NIL)))</code>.
Списочные структуры в Лиспе и Хаскеле описываются в соответствии с нотацией: заключением одного списка в другой. При этом в нотации Лиспа сделано послабление,
Как говорилось во
<code>5 :: Integer</code>
Строка 20:
Это будет читаться как «Числовая константа <code>5</code> имеет тип Целое число».
Ещё Хаскел поддерживает [[w:полиморфизм|полиморфные]] типы, или шаблоны типов. Если, например, записать <code>[a]</code>, то это будет обозначать тип «список из атомов любого типа»,
== Соглашения по именованию ==
Строка 28:
== Определители списков и математические последовательности ==
Пожалуй, Хаскел — единственный язык программирования, позволяющий просто и быстро конструировать списки, основанные на какой-нибудь простой математической формуле. Этот подход
<code>[ x | x <- xs ]</code>
Строка 73:
<code>add 5 7</code>
Здесь видно, что нотация Хаскела наиболее сильно приближена к нотации абстрактного математического языка. Однако он пошел ещё дальше Лиспа в этом вопросе, и в нём есть нотация для описания некаррированных функций,
<code>add (x, y) = x + y</code>
Строка 82:
inc = add 1</code>
<code>map :: (a -> b) -> [a] -> [b]
Строка 112:
<code>add = \x -> \y -> x + y</code>
Остаётся отметить, что тип λ-абстракции определяется точно так же, как и тип функций. Тип λ-выражения вида <math>\lambda x.\operatorname{expr}</math> будет выглядеть как <math>
== Инфиксный способ записи функций ==
Строка 137:
Это три секции, каждая из которых определяет инфиксную операцию конкатенации списков в соответствии с количеством переданных ей аргументов. Использование круглых скобок в записи секций обязательно.
Если функция принимает два параметра, то её также можно записывать в инфиксной форме. Однако если просто записать между параметрами имя функции, это будет ошибкой, ибо в строгой нотации Хаскела это будет просто двойным применением, причём в одном применении не будет хватать одного операнда. Чтобы записать функцию в инфиксной форме, её имя необходимо заключить в символы обратного апострофа — <code>[[w:
Для вновь определённых инфиксных операций возможно определение порядка вычисления. Для этого в Хаскеле есть зарезервированное слово <code>infixr</code>, которое назначает операции приоритет выполения в интервале от 0 до 9: 9 объявляется самой сильной степенью значимости. 10 также входит в этот интервал, и именно эту степень имеет операция применения). Вот так определяются степени для определенных в примерах 14 и 15 операций:
Строка 144:
infixr 9 .</code>
В Хаскеле все функции являются нестрогими, что значит: все они поддерживают отложенные вычисления. Если какая-то функция определена как <code>bot = bot</code>, то её вызов даст ошибку, и такие ошибки обычно сложно отслеживать. Но если есть некая константная функция, которая определена как <code>constant_1 x = 1</code>, то при вызове конструкции <code>(constant_1 bot)</code> никакой ошибки не произойдёт,
== Упражнения ==
|