Haskell (язык программирования)

редактировать
Функциональный язык программирования

Haskell
Logo of Haskell
Paradigm Чисто функциональный
Разработано Леннарт Аугустссон, Дэйв Бартон, Брайан Бутель, Уоррен Бертон, Джозеф Фазель, Кевин Хаммонд, Ральф Хинце, Пол Худак, Джон Хьюз, Томас Джонссон, Марк Джонс, Саймон Пейтон Джонс, Джон Лаанчбери, Эрик Мейер, Джон Петерсон, Аластер Рид, Колин Рансимен, Филип Уодлер
Первое появление1990; 30 лет назад (1990)
Стабильный выпуск Haskell 2010 / июль 2010; 10 лет назад (2010-07)
Предварительный выпуск Haskell 2020 анонсировал
Дисциплина ввода Предполагаемый, статический, сильный
OS Кросс-платформенный
Расширения имен файлов .hs,.lhs
Веб-сайтwww.haskell.org
Основные реализации
GHC, Hugs, NHC, JHC, Yhc, UHC
Диалекты
, Gofer
Под влиянием
Clean,FP,Gofer, Hope и Хоуп, Id,ISWIM, KRC, Lisp, Miranda,ML и Standard ML, Orwell, SASL, Схема, SISAL
Под влиянием
Agda, Bluespec, C ++ 11 / Концепты,C# /LINQ, CAL, Cayenne, Clean, Clojure, CoffeeScript, Карри, Эльм, Эпиграмма, Эшер,F#,,Хак, Идрис, Изабель, Java / Generics, LiveScript, Mercury, Ωmega, PureScript, Python, Raku, Rust, Scala, Swift,, Visual Basic 9.0

Haskell - это универсальный, статически типизированный, чисто функциональный язык программирования с выводом типа и ленивая оценка. Разработанный для обучения, исследований и промышленного применения, Haskell первым ввел ряд расширенных функций языка программирования, таких как классы типов, которые позволяют type-safe перегрузку операторов. Основная реализация Haskell - это Glasgow Haskell Compiler (GHC). Он назван в честь логика Haskell Curry.

Семантика Haskell исторически основана на семантике языка программирования Miranda, на котором сосредоточены усилия исходной рабочей группы Haskell. Последняя формальная спецификация языка была сделана в июле 2010 года, в то время как разработка реализации GHC продолжала расширять Haskell с помощью языковых расширений. Следующая формальная спецификация запланирована на 2020 год.

Haskell используется в академических кругах и промышленности. По состоянию на сентябрь 2019 года Haskell был 23-м по популярности языком программирования с точки зрения поиска в Google учебных пособий и составлял менее 1% активных пользователей в репозитории исходного кода GitHub.

Содержание

  • 1 История
    • 1.1 Haskell 1.0–1.4
    • 1.2 Haskell 98
    • 1.3 Haskell 2010
  • 2 Возможности
  • 3 Примеры кода
  • 4 Реализации
  • 5 Известные приложения
    • 5.1 Промышленность
    • 5.2 Интернет
  • 6 Критика
  • 7 Родственные языки
  • 8 Конференции и семинары
  • 9 Ссылки
  • 10 Дополнительная литература
  • 11 Внешние ссылки

История

После выпуска Miranda от Research Software Ltd. В 1985 году интерес к ленивым функциональным языкам вырос. К 1987 году существовало более дюжины нестрогих чисто функциональных языков программирования. Миранда была наиболее широко используемой, но это была проприетарная программа. На конференции по языкам функционального программирования и компьютерной архитектуре (FPCA '87) в Портленде, штат Орегон, был достигнут твердый консенсус о создании комитета для определения открытого стандарта . для таких языков. Целью комитета было объединить существующие функциональные языки в общий, чтобы служить основой для будущих исследований в области проектирования функциональных языков.

Haskell 1.0–1.4

Классы типов, которые позволяют выполнять перегрузку оператора type-safe , были впервые предложены Филипом Уодлером и Стивеном Блоттом для Standard ML, но были впервые реализованы в Haskell между 1987 и версией 1.0.

Первая версия Haskell («Haskell 1.0») была определена в 1990 году. Усилия комитета привели к серии определений языка (1.0, 1.1, 1.2, 1.3, 1.4).

Классы типов возникли в Haskell

Haskell 98

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

В феврале 1999 года стандарт языка Haskell 98 был первоначально опубликован как The Haskell 98 Report. В январе 2003 года была опубликована исправленная версия под названием Haskell 98 Language and Libraries: The Revised Report. Язык продолжает быстро развиваться, и реализация Glasgow Haskell Compiler (GHC) представляет собой текущий стандарт де-факто.

Haskell 2010

В начале 2006 г. началось определение преемника стандарта Haskell 98, неофициально названного Haskell Prime. Предполагалось, что это будет непрерывный поэтапный процесс пересмотра определения языка, производящий новый пересмотр до одного раза в год. Первая ревизия, названная Haskell 2010, была анонсирована в ноябре 2009 года и опубликована в июле 2010 года.

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

  • Имена иерархических модулей. Имена модулей могут состоять из разделенных точками последовательностей идентификаторов с заглавной буквы, а не только одного такого идентификатора. Это позволяет именовать модули иерархически (например, Data.Listвместо List), хотя технически модули все еще находятся в едином монолитном пространстве имен. Это расширение было указано в дополнении к Haskell 98 и на практике использовалось повсеместно.
  • интерфейс внешних функций (FFI) допускает привязку к другим языкам программирования. В отчете указываются только привязки к C, но дизайн допускает привязки других языков. Для поддержки этого объявления типа данных разрешалось не содержать конструкторов, что позволяло использовать надежные типы nonce для внешних данных, которые не могли быть созданы в Haskell. Это расширение также ранее было указано в Приложении к отчету Haskell 98 и широко использовалось.
  • Так называемые n + k шаблоны (определения формы fact (n + 1) = (n + 1) * факт n) больше не допускались. Этот синтаксический сахар имел вводящую в заблуждение семантику, в которой код выглядел так, как будто он использовал оператор (+), но фактически отказался от кода с использованием (-)и (>=).
  • Правила вывода типа были ослаблены, чтобы позволить большему количеству программ выполнять проверку типа.
  • Некоторые проблемы синтаксиса (изменения в формальная грамматика) были исправлены: были добавлены шаблоны защиты, позволяющие сопоставление шаблонов внутри защиты; разрешение фиксации оператора было задано более простым способом, отражающим реальную практику; Был рассмотрен крайний случай взаимодействия лексического синтаксиса языка операторов и комментариев, а взаимодействие do-notation и if-then-else было изменено для устранения неожиданных синтаксических ошибок.
  • Была указана прагма LANGUAGE. К 2010 году десятки расширений языка широко использовались, и GHC (среди других компиляторов) предоставил прагму LANGUAGEдля указания отдельных расширений со списком идентификаторов. Компиляторы Haskell 2010 должны поддерживать расширение Haskell2010и рекомендуется поддерживать несколько других, которые соответствуют расширениям, добавленным в Haskell 2010.

Возможности

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

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

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

У Haskell есть открытая опубликованная спецификация, и существует несколько реализаций. Его основная реализация, Glasgow Haskell Compiler (GHC), является одновременно интерпретатором и компилятором нативного кода , который работает на большинстве платформ.. GHC известен своей богатой системой типов, включающей последние инновации, такие как обобщенные алгебраические типы данных и семейства типов. Игра Computer Language Benchmarks Game также подчеркивает свою высокопроизводительную реализацию параллелизма и параллелизма.

Вокруг языка существует активное, растущее сообщество, и более 5400 третьих - сторонние библиотеки и инструменты с открытым исходным кодом доступны в онлайн-репозитории пакетов Hackage.

Примеры кода

A «Hello, World!» program в Haskell (строго необходима только последняя строка):

module Main (main) где - не требуется в интерпретаторе, по умолчанию в файле модуля main :: IO () - компилятор может вывести определение этого типа main = putStrLn "Hello, World!"

Функция factorial в Haskell, определенная несколькими разными способами:

- Аннотация типа (необязательно, одинаковая для каждой реализации) factorial :: (Integral a) =>a ->a - Использование рекурсии (с выражением ifthenelse) factorial n = if n < 2 then 1 else n * factorial (n - 1) -- Using recursion (with pattern matching) factorial 0 = 1 factorial n = n * factorial (n - 1) -- Using recursion (with guards) factorial n | n < 2 = 1 | otherwise = n * factorial (n - 1) -- Using a list and the "product" function factorial n = product [1..n] -- Using fold (implements "product") factorial n = foldl (*) 1 [1..n] -- Point-free style factorial = foldr (*) 1. enumFromTo 1

Поскольку тип Integer имеет произвольную точность, этот код будет вычислять такие значения, как factorial 100000(число из 456 574 цифр) без потери точности.

Реализация алгоритма, аналогичного быстрой сортировке по спискам, где первый элемент берется в качестве точки поворота:

- Аннотация типа (необязательно, одинаковая для каждой реализации) quickSort :: Ord a =>[a] ->[a] - Использование списков quickSort = - Пустой список уже отсортирован quickSort (x: xs) = quickSort [a | a <- xs, a < x] -- Sort the left part of the list ++ [x] ++ -- Insert pivot between two sorted parts quickSort [a | a <- xs, a>= x] - Сортировка правой части списка - Использование фильтра quickSort = quickSort (x: xs) = quickSort (filter (= x) xs)

Реализации

Все перечисленные реализации распространяются по лицензиям с открытым исходным кодом.

Реализации, которые полностью или почти соответствуют стандарту Haskell 98, включают:

  • Glasgow Haskell Compiler (GHC) компилируется в собственный код на многих различных архитектурах процессоров и на ANSI C, через один из двух промежуточных языков : C-- или, в более поздних версиях, LLVM (ранее - Виртуальная машина низкого уровня) битовый код. GHC стал де-факто стандартным диалектом Haskell. Существуют библиотеки (например, привязки к OpenGL ), которые работают только с GHC. GHC также распространяется с платформой Haskell..
  • Jhc, компилятор Haskell, написанный Джоном Мичем, подчеркивает скорость и эффективность сгенерированных программ и исследует новые программные преобразования.
    • Ajhc - это форк Jhc.
  • Утрехтский компилятор Haskell (UHC) - это реализация Haskell от Утрехтского университета. Он поддерживает почти все функции Haskell 98 плюс множество экспериментальных расширений. Он реализован с использованием грамматик атрибутов и в настоящее время используется в основном для исследования сгенерированных систем типов и языковых расширений.

Реализации, которые больше не поддерживаются активно, включают:

  • Систему Gofer пользователя Haskell (Hugs ) - это интерпретатор байт-кода . Когда-то это была одна из наиболее широко используемых реализаций, наряду с компилятором GHC, но теперь она в основном заменена GHCi. Он также поставляется с графической библиотекой.
  • HBC - ранняя реализация, поддерживающая Haskell 1.4. Он был реализован Леннартом Аугустссоном в и на основе Lazy ML. Некоторое время он активно не разрабатывался.
  • nhc98 - компилятор байт-кода, ориентированный на минимизацию использования памяти.
    • Компилятор York Haskell (Yhc ) был форком nhc98 с целью сделать его более простым, портативным и эффективным, а также интегрировать поддержку Hat, трассировщика Haskell. Он также имел бэкэнд JavaScript, позволяющий пользователям запускать программы Haskell в веб-браузерах.

Реализации, не полностью совместимые с Haskell 98, и с использованием варианта языка Haskell, включая:

  • Eta и Frege - диалекты Haskell, нацеленные на виртуальную машину Java.
  • Gofer был образовательным диалектом Haskell с функцией, называемой конструкторскими классами, разработанной Марком Джонсом. Он был заменен Hugs (система Gofer пользователя Haskell).
  • Helium, новый диалект Haskell. Основное внимание уделяется упрощению обучения за счет более четких сообщений об ошибках. В настоящее время в нем отсутствует полная поддержка классов типов, что делает его несовместимым со многими программами Haskell.

Известные приложения

  • Cabal - это инструмент для создания и упаковки библиотек и программ Haskell.
  • Darcs - это система контроля версий, написанная на Haskell, с несколькими инновационными функциями, такими как более точный контроль над применяемыми исправлениями.
  • GHC также часто является испытательной площадкой для расширенного функционального программирования функции и оптимизации на других языках программирования.
  • Git-application - это инструмент для управления (большими) файлами данных в системе контроля версий Git. Он также предоставляет распределенную систему синхронизации файлов (git-application assistant).
  • Linspire GNU / Linux выбрала Haskell для разработки системных инструментов.
  • Pandoc - это инструмент для преобразования одного формата разметки в другой.
  • Pugs - это компилятор и интерпретатор для Raku языка программирования (ранее Perl 6).
  • Xmonad - это оконный менеджер для X Window System, полностью написанный на Haskell.

Industry

  • Bluespec SystemVerilog (BSV) - это язык для полупроводниковая конструкция, являющаяся расширением Haskell. Кроме того, инструменты Bluespec, Inc. реализованы в Haskell.
  • Cryptol, язык и набор инструментов для разработки и проверки алгоритмов криптографии, реализованы в Haskell.
  • Facebook реализует свои программы защиты от спама в Haskell, поддерживая базовую библиотеку доступа к данным в виде программного обеспечения с открытым исходным кодом.
  • GitHub, реализованного, библиотеки с открытым исходным кодом для анализа, сравнения и интерпретации ненадежного исходного кода, в Haskell.
  • seL4, первое формально проверенное микроядро, использовало Haskell в качестве языка прототипирования для разработчика ОС. В то же время код Haskell определил исполняемую спецификацию, с помощью которой можно было бы рассуждать для автоматического перевода с помощью инструмента доказательства теорем. Таким образом, код Haskell служил промежуточным прототипом перед окончательной доработкой C.

Web

Известные веб-фреймворки, написанные для Haskell, включают:

Критика

Ян-Виллем Мессен в 2002 г. и Саймон Пейтон Джонс в 2003 г. обсуждали проблемы, связанные с ленивым оцениванием, а также признавали теоретические мотивы этого. В дополнение к чисто практическим соображениям, таким как повышение производительности, они отмечают, что, помимо добавления некоторых накладных расходов на производительность, ленивая оценка затрудняет программистам оценку производительности своего кода (особенно его использования пространства).

Бастиан Херен, Даан Лейен и Арьян ван Эйзендорн в 2003 году также заметили некоторые камни преткновения для изучающих Haskell: «Тонкий синтаксис и сложная система типов Haskell - палка о двух концах, которую высоко ценят опытные программисты, но также источник разочарования среди новичков, поскольку универсальность Haskell часто приводит к появлению загадочных сообщений об ошибках ". Чтобы решить эту проблему, исследователи из Утрехтского университета разработали продвинутый интерпретатор под названием, который улучшил удобство использования сообщений об ошибках, ограничив универсальность некоторых функций Haskell и, в частности, удалив поддержку классов типов ..

Ben Lippmeier разработал Disciple как строгий по умолчанию (ленивый за счет явной аннотации) диалект Haskell с системой типов и эффектов, чтобы устранить трудности Haskell в рассуждении о ленивых вычислениях и использовании традиционных структур данных, таких как изменяемые массивы. Он утверждает (стр. 20), что «деструктивное обновление предоставляет программисту два важных и мощных инструмента... набор эффективных структур данных, подобных массиву, для управления коллекциями объектов и... возможность транслировать новое значение в все части программы с минимальной нагрузкой на программиста ».

Роберт Харпер, один из авторов Standard ML, объяснил причины отказа от использования Haskell для обучения вводному программированию. Среди них - сложность рассуждений об использовании ресурсов с нестрогим вычислением, то, что ленивое вычисление усложняет определение типов данных и индуктивные рассуждения, и «неполноценность» (старой) системы классов Haskell по сравнению с системой модулей ML.

Инструмент сборки Haskell, Cabal, исторически подвергался критике за плохую обработку нескольких версий одной и той же библиотеки, проблему, известную как «ад Кабала». Сервер Stackage и инструмент сборки Stack были созданы в ответ на эту критику. Сам Cabal теперь имеет гораздо более сложную систему сборки, в значительной степени вдохновленную Nix, которая стала стандартной в версии 3.0.

Родственные языки

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

Был разработан ряд языков, вдохновленных Haskell, но с разными системами типов, включая:

Другие родственные языки включают:

  • Curry, язык функционального / логического программирования на основе Haskell.

Известные варианты Haskell включают:

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

Конференции и семинары

Сообщество Haskell регулярно встречается для проведения исследований и разработок. Основными событиями являются:

С 2006 года проводится серия организованных хакатонов, серия Hac, направленных на улучшение инструментов и библиотек языков программирования.

Ссылки

Дополнительная литература

Отчеты
Учебники
Учебники
История

Внешние ссылки

В Викиучебнике есть книга на тему: Haskell
Викиучебник есть книга по теме: Напишите схему за 48 часов
Последняя правка сделана 2021-05-23 03:04:39
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте