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.
После выпуска Miranda от Research Software Ltd. В 1985 году интерес к ленивым функциональным языкам вырос. К 1987 году существовало более дюжины нестрогих чисто функциональных языков программирования. Миранда была наиболее широко используемой, но это была проприетарная программа. На конференции по языкам функционального программирования и компьютерной архитектуре (FPCA '87) в Портленде, штат Орегон, был достигнут твердый консенсус о создании комитета для определения открытого стандарта . для таких языков. Целью комитета было объединить существующие функциональные языки в общий, чтобы служить основой для будущих исследований в области проектирования функциональных языков.
Классы типов, которые позволяют выполнять перегрузку оператора type-safe , были впервые предложены Филипом Уодлером и Стивеном Блоттом для Standard ML, но были впервые реализованы в Haskell между 1987 и версией 1.0.
Первая версия Haskell («Haskell 1.0») была определена в 1990 году. Усилия комитета привели к серии определений языка (1.0, 1.1, 1.2, 1.3, 1.4).
Классы типов возникли в HaskellВ конце 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) представляет собой текущий стандарт де-факто.
В начале 2006 г. началось определение преемника стандарта Haskell 98, неофициально названного Haskell Prime. Предполагалось, что это будет непрерывный поэтапный процесс пересмотра определения языка, производящий новый пересмотр до одного раза в год. Первая ревизия, названная Haskell 2010, была анонсирована в ноябре 2009 года и опубликована в июле 2010 года.
Haskell 2010 - это инкрементное обновление языка, в основном включающее несколько хорошо используемых и неоспоримых функций. ранее включался через специфичные для компилятора флаги.
Data.List
вместо List
), хотя технически модули все еще находятся в едином монолитном пространстве имен. Это расширение было указано в дополнении к Haskell 98 и на практике использовалось повсеместно.fact (n + 1) = (n + 1) * факт n
) больше не допускались. Этот синтаксический сахар имел вводящую в заблуждение семантику, в которой код выглядел так, как будто он использовал оператор (+)
, но фактически отказался от кода с использованием (-)
и (>=)
.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, включают:
Реализации, которые больше не поддерживаются активно, включают:
Реализации, не полностью совместимые с Haskell 98, и с использованием варианта языка Haskell, включая:
Известные веб-фреймворки, написанные для 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, но с разными системами типов, включая:
Другие родственные языки включают:
Известные варианты Haskell включают:
Сообщество Haskell регулярно встречается для проведения исследований и разработок. Основными событиями являются:
С 2006 года проводится серия организованных хакатонов, серия Hac, направленных на улучшение инструментов и библиотек языков программирования.
В Викиучебнике есть книга на тему: Haskell |
Викиучебник есть книга по теме: Напишите схему за 48 часов |