НОУ ІНТУІТ, Лекція, Введення

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

Цей опис визначає синтаксис програм на Haskell та неформальну абстрактну семантику для розуміння змісту таких програм.

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

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

У цьому розділі ми описуємо абстрактну синтаксичну та семантичну структуру Haskell, а також те, як вона співвідноситься з організацією решти опису.

Даний опис спрямований знизу вгору до синтаксичної структури Haskell.

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

1.2. Ядро Haskell

Haskell запозичив багато зручних синтаксичних структур, які стали популярними у функціональному програмуванні. У цьому описі значення такого синтаксичного засобу дається трансляцією у простіші.конструкції. Якщо ці трансляції повністю застосовні, результатом є програма, записана в невеликому підмножині Haskell, яке ми називаємо ядром Haskell.

Хоча ядро ​​формально не визначено, це по суті трохи пом'якшений варіант лямбда-обчислення з прямо позначеною семантикою. Трансляція кожної синтаксичної структури ядро ​​дається, коли вводиться синтаксис . Ця модульна конструкція полегшує пояснення програм Haskell і надає корисні рекомендації для розробників реалізацій мови.

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

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

Помилки в Haskell семантично еквівалентні. З формальної точки зору, вони не відрізняються від незавершеного обчислення, тому мова не містить механізму виявлення або реагування на помилки. Тим не менш, реалізації мови ймовірно намагатимуться надати корисну інформацію про помилки (див. розділ "3.1").

1.4. Простір імен

Є шість видів імен у Haskell: імена змінних та конструкторів позначають значення; імена змінних типів, конструкторів типів і типів класів посилаються на сутності, які стосуються системі типів; імена модулів посилаються на модулі. Є два обмеження на присвоєння імен:

  1. Іменами змінних та змінних типів є ідентифікатори, які починаються з малих літер або символу підкреслення; решта чотирьох видів імен єідентифікаторами, які починаються з великих літер.
  2. Ідентифікатор не можна використовувати як ім'я конструктора типу та класу в одній і тій же області видимості.

Це єдині обмеження; наприклад, Int може одночасно бути ім'ям модуля, класу та конструктора в межах однієї області видимості.