Опубликован: 19.09.2008 | Доступ: свободный | Студентов: 656 / 70 | Оценка: 4.50 / 5.00 | Длительность: 21:25:00
Лекция 2:

Введение

< Лекция 1 || Лекция 2 || Лекция 3 >

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

Это описание определяет синтаксис программ на Haskell и неформальную абстрактную семантику для понимания смысла таких программ.

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

1.1. Структура программы

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

  1. Самый верхний уровень программы на Haskell представляет собой набор модулей, описанных в лекции "5" . Модули предоставляют средство управления пространствами имен и повторного использования программного обеспечения в больших программах.
  2. Верхний уровень модуля состоит из совокупности объявлений, которых существует несколько видов, все они описаны в лекции "4" . Объявления определяют такие сущности, как обычные значения, типы данных, классы типов, ассоциативность и приоритеты операторов.
  3. На следующем, более низком, уровне находятся выражения , описанные в лекции "3" . Выражение обозначает значение и имеет статический тип; выражения лежат в основе программирования на Haskell "в малом".
  4. На нижнем уровне находится лексическая структура Haskell , определенная в лекции "2" .Лексическая структура охватывает конкретное представление программ на Haskell в текстовых файлах.

Данное описание направлено снизу вверх по отношению к синтаксической структуре Haskell.

Лекции, которые не упомянуты выше, - это лекция "6" , которая описывает стандартные встроенные типы данных и классы в Haskell , и лекция "7" , в которой рассматривается средство ввода - вывода в Haskell (т.е. как программы на Haskell связываются со внешним миром). Также есть несколько лекций, описывающих Prelude, конкретный синтаксис, грамотное программирование, подробное описание производных экземпляров и псевдокомментарии, поддерживаемые большинством компиляторов Haskell.

Примеры фрагментов программ на Haskell в данном тексте даны в машинописном шрифте:

let x = 1

z = x+y

in z+1

"Дыры" во фрагментах программ, представляющие собой произвольные части кода на Haskell , написаны в курсиве, как, например, в if e1 then e2 else e3. Вообще курсивные имена являются мнемоническими, например, e - для выражений (expressions), d - для объявлений (declarations), t - для типов (types) и т.д.

1.2. Ядро Haskell

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

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

1.3. Значения и типы

Результатом вычисления выражения является значение. Выражение имеет статический тип. Значения и типы не смешаны в Haskell. Тем не менее, система типов допускает определяемые пользователем типы данных различных видов и разрешает не только параметрический полиморфизм (используя традиционную структуру типов Хиндли-Милнера (Hindley-Milner)), но также специальный полиморфизм, или перегрузку (используя классы типов).

Ошибки в Haskell семантически эквивалентны \perp. С формальной точки зрения они не отличимы от незавершенного вычисления, поэтому язык не содержит механизма обнаружения или реагирования на ошибки. Тем не менее, реализации языка вероятно будут пытаться предоставить полезную информацию об ошибках (см. раздел "3.1" ).

1.4. Пространства имен

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

  1. Именами переменных и переменных типов являются идентификаторы, которые начинаются со строчных букв или символа подчеркивания; остальные четыре вида имен являются идентификаторами, которые начинаются с заглавных букв.
  2. Идентификатор нельзя использовать в качестве имени конструктора типа и класса в одной и той же области видимости.

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

< Лекция 1 || Лекция 2 || Лекция 3 >
Николай Щербаков
Николай Щербаков
Россия, Москва
Олег Корсак
Олег Корсак
Латвия, Рига