Семантика Haskell исторически основана на семантике языка программирования Miranda , который служил для сосредоточения усилий первоначальной рабочей группы Haskell. [28] Последняя официальная спецификация языка была сделана в июле 2010 года, в то время как разработка GHC продолжает расширять Haskell за счет языковых расширений.
Haskell используется в научных кругах и промышленности. [29] [30] [31] По состоянию на май 2021 года [обновлять]Haskell был 28-м по популярности языком программирования по результатам поиска учебных пособий в Google , [32] и составлял менее 1% активных пользователей в репозитории исходного кода GitHub . [33]
История
После выпуска Miranda компанией Research Software Ltd. в 1985 году интерес к ленивым функциональным языкам вырос. К 1987 году существовало более дюжины нестрогих , чисто функциональных языков программирования. Miranda использовалась наиболее широко, но это было проприетарное программное обеспечение . На конференции по функциональным языкам программирования и компьютерной архитектуре (FPCA '87) в Портленде, штат Орегон , было достигнуто твердое согласие о создании комитета для определения открытого стандарта для таких языков. Целью комитета было объединить существующие функциональные языки в один, который послужит основой для будущих исследований в области проектирования функциональных языков. [34]
Хаскель от 1.0 до 1.4
Haskell был разработан комитетом, пытавшимся по возможности объединить готовые решения.
В ранних версиях Haskell, вплоть до версии 1.2, взаимодействие с пользователем и ввод-вывод (ввод и вывод) обрабатывались как механизмами, основанными на потоках, так и механизмами продолжения, которые многие считали неудовлетворительными. [36] В версии 1.3 был введен монадический ввод-вывод, а также обобщение классов типов на более высокие виды (конструкторы типов). Наряду с «нотацией do», которая обеспечивает синтаксический сахар для класса типов Monad, это дало Haskell систему эффектов, которая поддерживала ссылочную прозрачность и была удобна.
Другими заметными изменениями в ранних версиях были подход к функции seq, которая создает зависимость данных между значениями и используется в ленивых языках, чтобы избежать чрезмерного потребления памяти; при этом он переходит от класса типа к стандартной функции, чтобы сделать рефакторинг более практичным.
Первая версия Haskell («Haskell 1.0») была определена в 1990 году. [1] Усилия комитета привели к созданию серии определений языка (1.0, 1.1, 1.2, 1.3, 1.4).
Иерархия классов типов в прелюдии Haskell начиная с GHC 7.10. Включение Foldable и Traversable (с соответствующими изменениями в сигнатурах типов некоторых функций) и Applicative в качестве промежуточного между Functor и Monad является отклонением от стандарта Haskell 2010.
Хаскель 98
В конце 1997 года кульминацией этой серии стал Haskell 98 , призванный определить стабильную, минимальную, переносимую версию языка и сопутствующую стандартную библиотеку для обучения, а также в качестве основы для будущих расширений. Комитет категорически приветствовал создание расширений и вариантов Haskell 98 посредством добавления и включения экспериментальных функций. [34]
В феврале 1999 года стандарт языка Haskell 98 был первоначально опубликован как The Haskell 98 Report . [34] В январе 2003 года исправленная версия была опубликована как Haskell 98 Language and Libraries: The Revised Report . [27] Язык продолжает быстро развиваться, а реализация Glasgow Haskell Compiler (GHC) представляет собой текущий стандарт де-факто . [37]
Хаскелл 2010
В начале 2006 года начался процесс определения преемника стандарта Haskell 98, неофициально названного Haskell Prime . [38] Предполагалось, что это будет непрерывный постепенный процесс пересмотра определения языка, который будет производиться до одного раза в год. Первая версия, названная Haskell 2010 , была анонсирована в ноябре 2009 года [2] и опубликована в июле 2010 года.
Haskell 2010 — это постепенное обновление языка, в основном включающее несколько широко используемых и неоспоримых функций, которые ранее включались с помощью специфичных для компилятора флагов.
Иерархические имена модулей. Имена модулей могут состоять из последовательностей идентификаторов, разделенных точками, а не только из одного такого идентификатора. Это позволяет модулям именоваться иерархически (например, Data.Listвместо List), хотя технически модули по-прежнему находятся в одном монолитном пространстве имен. Это расширение было указано в дополнении к Haskell 98 и на практике использовалось повсеместно.
Интерфейс внешних функций (FFI) позволяет выполнять привязку к другим языкам программирования. В Отчете указаны только привязки к C , но конструкция допускает привязки к другим языкам. Чтобы поддержать это, объявлениям типов данных было разрешено не содержать конструкторов, что позволило использовать надежные типы nonce для внешних данных, которые нельзя было создать в Haskell. Это расширение также было ранее указано в дополнении к отчету Haskell 98 и широко использовалось.
Так называемые шаблоны n + k (определения формы fact (n+1) = (n+1) * fact n) больше не допускались. Этот синтаксический сахар имел вводящую в заблуждение семантику: код выглядел так, как будто он использует (+)оператор, но на самом деле он не соответствовал коду с использованием (-)и (>=).
Правила вывода типов были смягчены, чтобы позволить большему количеству программ выполнять проверку типов.
Исправлены некоторые синтаксические проблемы (изменения в формальной грамматике): добавлены защитные меры по шаблону , позволяющие сопоставлять шаблоны внутри защитных мер; разрешение фиксированности оператора было задано более простым способом, отражающим реальную практику; Был рассмотрен крайний случай взаимодействия лексического синтаксиса операторов и комментариев языка, а взаимодействие do-нотации и if-then-else было изменено для устранения непредвиденных синтаксических ошибок.
Прагма была LANGUAGEуказана . К 2010 году широко использовались десятки расширений языка, и GHC (среди других компиляторов) предоставил прагму LANGUAGEдля указания отдельных расширений со списком идентификаторов. Компиляторы Haskell 2010 обязаны поддерживать это Haskell2010расширение, а также рекомендуется поддерживать несколько других, которые соответствуют расширениям, добавленным в Haskell 2010.
Будущие стандарты
Следующая официальная спецификация была запланирована на 2020 год. [3] 29 октября 2021 года с версией GHC 9.2.1 было выпущено расширение GHC2021. Хотя это не формальная спецификация языка, она сочетает в себе ряд стабильных и широко используемых расширений GHC для Haskell 2010. [39] [40]
Haskell имеет строгую статическую систему типов , основанную на выведении типа Хиндли-Милнера . Его основным нововведением в этой области являются классы типов, первоначально задуманные как принципиальный способ добавить перегрузку языка [41] , но с тех пор нашли множество других применений. [42]
Конструкция, представляющая побочные эффекты, является примером монады : общей структуры, которая может моделировать различные вычисления, такие как обработка ошибок, недетерминизм , синтаксический анализ и программная транзакционная память . Они определяются как обычные типы данных, но Haskell предоставляет некоторый синтаксический сахар для их использования.
Вокруг языка существует активное, растущее сообщество, и в онлайн-репозитории пакетов Hackage доступно более 5400 сторонних библиотек и инструментов с открытым исходным кодом . [44]
Примеры кода
« Привет , мир!» программа на Haskell (строго обязательна только последняя строка):
модуль Main ( main ) , где -- не требуется в интерпретаторе, используется по умолчанию в файле модуляmain :: IO () -- компилятор может вывести это определение типа main = putStrLn "Hello, World!"
Функция факториал в Haskell, определенная несколькими разными способами (первая строка — это аннотация типа , которая не является обязательной и одинаковой для каждой реализации):
факториал :: ( Интеграл a ) => a -> a-- Использование рекурсии (с выражением "ifthenelse") факториал n = если n < 2 , то 1 else n * факториал ( n - 1 )-- Использование рекурсии (с сопоставлением с образцом) факториал 0 = 1 факториал n = n * факториал ( n - 1 )-- Использование рекурсии (с защитой) Factorial n | п < 2 знак равно 1 | иначе = n * факториал ( n - 1 )-- Использование списка и функции "произведение" факториал n = произведение [ 1 .. n ]-- Использование сгиба (реализует "произведение") факториала n = foldl ( * ) 1 [ 1 .. n ]-- Факториал стиля без точек = foldr ( * ) 1 . перечислениеFromTo 1
импортировать Data.Function ( исправить )факториал = fix fac где fac f x | х < 2 = 1 | иначе = x * f ( x - 1 )
Поскольку тип Integer имеет произвольную точность , этот код будет вычислять такие значения, как factorial 100000(число из 456 574 цифр), без потери точности.
Реализация алгоритма, аналогичного быстрой сортировке списков, где в качестве опорного принимается первый элемент:
-- Введите аннотацию (необязательно, одинаковую для каждой реализации) QuickSort :: Ord a => [ a ] -> [ a ]-- Использование генераторов списков QuickSort [] = [] -- Пустой список уже отсортирован QuickSort ( x : xs ) = QuickSort [ a | a <- xs , a < x ] — Сортировка левой части списка ++ [ x ] ++ — Вставка опорной точки между двумя отсортированными частями QuickSort [ a | a <- xs , a >= x ] — Сортировка правой части списка-- Использование фильтра быстрой сортировки [] = [] быстрой сортировки ( x : xs ) = быстрой сортировки ( фильтра ( < x ) xs ) ++ [ x ] ++ быстрой сортировки ( фильтра ( >= x ) xs )
Реализации, которые полностью или почти соответствуют стандарту Haskell 98, включают:
Компилятор Glasgow Haskell (GHC) компилируется в собственный код на многих различных процессорных архитектурах и в ANSI C через один из двух промежуточных языков : C-- или, в более поздних версиях, биткод LLVM (ранее — виртуальная машина низкого уровня). [46] [47] GHC стал де-факто стандартным диалектом Haskell. [48] Существуют библиотеки (например, привязки к OpenGL ), которые работают только с GHC. GHC также распространялся вместе с платформой Haskell .
Jhc, компилятор Haskell, написанный Джоном Мичемом, уделяет особое внимание скорости и эффективности создаваемых программ и изучению новых преобразований программ.
Ajhc — это форк Jhc.
Утрехтский компилятор Haskell (UHC) — это реализация Haskell, разработанная Утрехтским университетом . [49] Он поддерживает почти все функции Haskell 98, а также множество экспериментальных расширений. Он реализован с использованием грамматик атрибутов и в основном используется для исследования систем сгенерированных типов и расширений языка.
Реализации, которые больше не поддерживаются активно, включают:
Система Gofer пользователя Haskell ( Hugs ) — интерпретатор байт-кода . Когда-то это была одна из наиболее широко используемых реализаций наряду с компилятором GHC [50] , но сейчас она в основном заменена GHCi. Он также поставляется с графической библиотекой.
HBC — ранняя реализация, поддерживающая Haskell 1.4. Он был реализован Леннартом Аугустссоном в Lazy ML и на его основе . Некоторое время он активно не развивался.
nhc98 — это компилятор байт-кода, ориентированный на минимизацию использования памяти.
Компилятор York Haskell ( Yhc ) был ответвлением nhc98, целью которого было сделать его более простым, портативным и эффективным, а также интегрировать поддержку Hat, трассировщика Haskell. Он также имел серверную часть JavaScript , позволяющую пользователям запускать программы Haskell в веб-браузерах .
Реализации, не полностью совместимые с Haskell 98 и использующие вариант языка Haskell, включают:
Gofer — это образовательный диалект Haskell с функцией, называемой классами-конструкторами , разработанный Марком Джонсом. Она заменена системой Gofer пользователя Haskell (Hugs).
Helium, новый диалект Haskell. Основное внимание уделяется упрощению обучения за счет более четких сообщений об ошибках за счет отключения классов типов по умолчанию.
Известные приложения
Помощник по доказательству Agda написан на Haskell. [51]
Cabal — это инструмент для создания и упаковки библиотек и программ Haskell. [52]
Darcs — это система контроля версий , написанная на Haskell, с несколькими инновационными функциями, такими как более точный контроль над применяемыми исправлениями.
GHC также часто является испытательным стендом для расширенных функций функционального программирования и оптимизации на других языках программирования.
Git-annex — это инструмент для управления (большими) файлами данных под контролем версий Git . Он также предоставляет распределенную систему синхронизации файлов (помощник git-annex).
Linspire Linux выбрала Haskell для разработки системных инструментов. [53]
Pandoc — это инструмент для преобразования одного формата разметки в другой.
GarganText [56] — это инструмент для совместной работы для отображения текстов семантического анализа в любом веб-браузере , полностью написанный на Haskell и PureScript , который используется, например, в исследовательском сообществе для составления современных отчетов и дорожных карт. [57]
Промышленность
Bluespec SystemVerilog (BSV) — это язык проектирования полупроводников, являющийся расширением Haskell. Кроме того, инструменты Bluespec, Inc. реализованы на Haskell. Обратите внимание, что это пример предметно-ориентированного языка, встроенного в Haskell.
Cryptol — язык и набор инструментов для разработки и проверки алгоритмов шифрования , реализован на Haskell.
seL4 , первое формально проверенное микроядро , [63] использовало Haskell в качестве языка прототипирования для разработчика ОС. [63] : стр.2 В то же время код Haskell определил исполняемую спецификацию, с помощью которой можно рассуждать для автоматического перевода с помощью инструмента доказательства теорем. [63] : стр.3 Таким образом, код Haskell служил промежуточным прототипом перед окончательной доработкой C. [63] : стр.3
Ян-Виллем Массен в 2002 году и Саймон Пейтон Джонс в 2003 году обсудили проблемы, связанные с ленивым вычислением, а также признали теоретические мотивы этого явления. [67] [68] Помимо чисто практических соображений, таких как повышение производительности, [69] они отмечают, что отложенное вычисление затрудняет программистам рассуждать о производительности своего кода (особенно о его использовании пространства).
Бастиан Херен, Даан Лейен и Арьян ван Айзендорн в 2003 году также заметили некоторые камни преткновения для изучающих Haskell: «Тонкий синтаксис и сложная система типов Haskell — это палка о двух концах, которую высоко ценят опытные программисты, но также и источник разочарования среди новичков». , поскольку общность Haskell часто приводит к загадочным сообщениям об ошибках». [70] Для устранения сообщений об ошибках исследователи из Утрехтского университета разработали усовершенствованный интерпретатор под названием Helium, который повысил удобство использования сообщений об ошибках за счет ограничения общности некоторых функций Haskell. В частности, он по умолчанию отключает классы типов. [71]
Бен Липпмейер разработал Disciple [72] как диалект Haskell строго по умолчанию (ленивый посредством явных аннотаций) с системой типов и эффектов, чтобы решить трудности Haskell в рассуждениях о ленивых вычислениях и использовании традиционных структур данных, таких как изменяемые массивы. [73] Он утверждает (стр. 20), что «деструктивное обновление предоставляет программисту два важных и мощных инструмента… набор эффективных структур данных, подобных массивам, для управления коллекциями объектов и… возможность транслировать новую ценность для всех частей программы с минимальной нагрузкой на программиста».
Роберт Харпер , один из авторов Standard ML, объяснил причины, по которым он не использует Haskell для обучения вводному программированию. Среди них — сложность рассуждений об использовании ресурсов с помощью нестрогих оценок, ленивые вычисления усложняют определение типов данных и индуктивные рассуждения, [74] и «неполноценность» (старой) системы классов Haskell по сравнению с системой модулей ML. [75]
Инструмент сборки Haskell, Cabal , исторически подвергался критике за плохую обработку нескольких версий одной и той же библиотеки, проблему, известную как «Кабаловый ад». Сервер Stackage и инструмент сборки Stack были созданы в ответ на эту критику. [76] Сам Cabal теперь имеет гораздо более сложную систему сборки, во многом вдохновленную Nix , [77] которая стала стандартной в версии 3.0.
Родственные языки
Clean — близкий, немного более старый родственник Haskell. Его самое большое отклонение от Haskell заключается в использовании типов уникальности вместо монад для ввода-вывода и побочных эффектов.
Был разработан ряд языков, вдохновленных Haskell, но с разными системами типов, в том числе:
Hume — строгий функциональный язык для встроенных систем , основанный на процессах в виде автоматов без сохранения состояния в своего рода кортежах одноэлементных каналов почтовых ящиков, где состояние сохраняется за счет обратной связи с почтовыми ящиками, а описание отображения выходов на каналы в виде коробочной проводки с Haskell-подобный язык выражений и синтаксис.
Конференции и семинары
Сообщество Haskell регулярно встречается для проведения исследований и разработок. Основные события:
ZuriHac, [78] своего рода хакатон , проводимый каждый год в Цюрихе .
Начиная с 2006 года проводится серия организованных хакатонов серии Hac, направленных на улучшение инструментов и библиотек языков программирования. [79]
Рекомендации
^ abc Худак и др. 2007.
^ Аб Марлоу, Саймон (24 ноября 2009 г.). «Анонс Haskell 2010». Haskell (список рассылки) . Проверено 12 марта 2011 г.
^ аб Ридель, Герберт (28 апреля 2016 г.). «ANN: Сформирован комитет Haskell Prime 2020» . Haskell-prime (список рассылки) . Проверено 6 мая 2017 г.
^ abcdefghijklm Пейтон Джонс 2003, с. xi
^ Норелл, Ульф (2008). «Зависимо типизированное программирование в Agda» (PDF) . Гетеборг: Университет Чалмерса . Проверено 9 февраля 2012 года .
^ Худак и др. 2007, стр. 12–38, 43.
^ Страуструп, Бьярн ; Саттон, Эндрю (2011). «Проектирование концептуальных библиотек для C++» (PDF) . Языковая инженерия программного обеспечения . Архивировано из оригинала (PDF) 10 февраля 2012 года.
^ abcdefghij Hudak et al. 2007, стр. 12–45–46.
^ Аб Мейер, Эрик (2006). «Исповедь продавца подержанных языков программирования: как привлечь массы к Haskell». Упсла 2007 . CiteSeerX 10.1.1.72.868 .
↑ Мейер, Эрик (1 октября 2009 г.). «Лекции C9: доктор Эрик Мейер - Основы функционального программирования, глава 1 из 13». Канал 9 . Майкрософт . Проверено 9 февраля 2012 года .
↑ Дроби, Садек (4 марта 2009 г.). «Эрик Мейер о LINQ». ИнфоQ . QCon SF 2008: C4Media Inc. Проверено 9 февраля 2012 года .{{cite news}}: CS1 maint: местоположение ( ссылка )
^ Хикки, Рич. «Книжная полка Clojure». Листмания! . Архивировано из оригинала 3 октября 2017 года . Проверено 3 октября 2017 г.
↑ Хеллер, Мартин (18 октября 2011 г.). «Задирайте нос от Dart и почувствуйте запах CoffeeScript». Инфомир . Проверено 15 июля 2020 г.
^ «Декларативное программирование в Эшере» (PDF) . Проверено 7 октября 2015 г.
^ Сайм, Дон ; Гранич, Адам; Чистернино, Антонио (2007). Эксперт F# . Апресс . п. 2. F# также опирается на Haskell, в частности, в отношении двух продвинутых функций языка, называемых выражениями последовательности и рабочими процессами .
^ «Facebook представляет «Hack», язык программирования будущего» . ПРОВОДНОЙ . 20 марта 2014 г.
^ «Идрис, зависимо типизированный язык» . Проверено 26 октября 2014 г.
^ «Вдохновение LiveScript» . Проверено 4 февраля 2014 г.
^ Фриман, Фил (2016). «PureScript на примере». Линпаб . Проверено 23 апреля 2017 г.
^ Кучлинг, AM «HOWTO по функциональному программированию». Документация Python v2.7.2 . Фонд программного обеспечения Python . Проверено 9 февраля 2012 года .
^ «Словарь терминов и жаргона». Perl Foundation Perl 6 Wiki . Фонд Перла . Архивировано из оригинала 21 января 2012 года . Проверено 9 февраля 2012 года .
^ «Влияния - Ссылка на ржавчину» . Справочник по ржавчине . Проверено 31 декабря 2023 г.
↑ Фогус, Майкл (6 августа 2010 г.). «Мартин Одерский возьми(5) в список». Отправьте больше парамедиков . Проверено 9 февраля 2012 года .
↑ Латтнер, Крис (3 июня 2014 г.). «Домашняя страница Криса Лэттнера». Крис Лэттнер . Проверено 3 июня 2014 г. Язык Swift — это продукт неустанных усилий команды языковых экспертов, гуру документации, ниндзя по оптимизации компиляторов и невероятно важной внутренней экспериментальной группы, которая предоставляла отзывы, помогающие совершенствовать и проверять идеи. Конечно, он также получил большую пользу от опыта, с трудом полученного многими другими языками в этой области, черпая идеи из Objective-C, Rust, Haskell, Ruby, Python, C#, CLU и многих других, чтобы их перечислять.
↑ Шевалье, Тим (28 января 2008 г.). «Кто-нибудь может сказать мне, как произносится слово «хаскелл»?». Haskell-кафе (Список рассылки) . Проверено 12 марта 2011 г.
^ Эдвард Кметт, Эдвард Кметт - Типовые классы против мира
↑ Моссберг, Эрик (8 июня 2020 г.), erkmos/haskell-companies , получено 22 июня 2020 г.
^ О'Салливан, Брайан; Герцен, Джон; Стюарт, Дональд Брюс (15 ноября 2008 г.). Реальный мир Haskell: код, в который можно поверить. «О'Рейли Медиа, Инк.». стр. xxviii – xxxi. ISBN978-0-596-55430-9.
^ «Haskell в производстве: Книга рисков» . Компания по разработке программного обеспечения Serokell . Проверено 7 сентября 2021 г.
^ «Индекс популярности языка программирования PYPL» . pypl.github.io . Май 2021 г. Архивировано из оригинала 7 мая 2021 г. Проверено 16 мая 2021 г.
^ Фредериксон, Бен. «Рейтинг языков программирования по пользователям GitHub». www.benfrederickson.com . Проверено 6 сентября 2019 г.
^ abc Пейтон Джонс 2003, Предисловие.
^ Уодлер, Филип (октябрь 1988 г.). «Как сделать специальный полиморфизм менее специальным».
^ "Haskell Wiki: Реализации" . Проверено 18 декабря 2012 г.
^ «Добро пожаловать в Haskell» . Haskell Wiki . Архивировано из оригинала 20 февраля 2016 года . Проверено 11 февраля 2016 г. .
^ Команда GHC 2020 (29 октября 2021 г.) Выпущен GHC 9.2.1
^ Предлагаемые изменения компилятора и языка для GHC и GHC/Haskell.
^ Вадлер, П.; Блотт, С. (1989). «Как сделать специальный полиморфизм менее специальным». Материалы 16-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования - POPL '89 . АКМ . стр. 60–76. дои : 10.1145/75277.75283 . ISBN978-0-89791-294-5. S2CID 15327197.
^ Халлгрен, Т. (январь 2001 г.). «Развлечение с функциональными зависимостями или типы как значения в статических вычислениях в Haskell». Материалы совместной зимней встречи CS/CE . Варберг, Швеция.
^ Игра с тестами компьютерного языка
^ "Статистика HackageDB" . Hackage.haskell.org. Архивировано из оригинала 3 мая 2013 года . Проверено 26 июня 2013 г.
^ «Реализации» в Haskell Wiki
^ "Бэкэнд LLVM" . ГХК Трак . 29 марта 2019 г.
^ Терей, Дэвид А.; Чакраварти, Мануэль М.Т. (2010). «Бэкэнд LLVM для GHC». Материалы симпозиума ACM SIGPLAN Haskell 2010 . АКМ Пресс.
^ К. Райдер и С. Томпсон (2005). «Портирование HaRe на GHC API»
^ Утрехтский компилятор Haskell
^ Худак и др. 2007, стр. 12–22.
↑ Agda 2, Сообщество Agda Github, 15 октября 2021 г. , получено 16 октября 2021 г.
^ "Заговор Хаскелла" . Проверено 8 апреля 2015 г.
^ «Команда Linspire/Freespire Core OS и Haskell» . Список рассылки Debian Haskell . Май 2006.
^ «Живой код с приливными циклами | Приливные циклы» . doc.tidalcycles.org . Проверено 19 января 2022 г.
^ xmonad.org
^ "Гаргантекст / Главное". 13 июля 2023 г.
^ Дэвид, Чавалариас; и другие. (8 мая 2023 г.). К программе исследований цифровых медиа и благополучия человечества (отчет).
^ «Борьба со спамом с помощью Haskell». Код Фейсбука . 26 июня 2015 г. Проверено 11 августа 2019 г.
^ «Haxl с открытым исходным кодом, библиотека для Haskell» . Код Фейсбука . 10 июня 2014 года . Проверено 11 августа 2019 г.
^ «input-output-hk/cardano-node: основной компонент, который используется для участия в децентрализованной цепочке блоков Cardano». Гитхаб . Проверено 18 марта 2022 г.
^ Анализ, анализ и сравнение исходного кода на многих языках: github/semantic, GitHub, 7 июня 2019 г. , получено 7 июня 2019 г.
^ «Отчет о семинаре для коммерческих пользователей функционального программирования» (PDF) . Проверено 10 июня 2022 г.
^ abcd Формальное доказательство функциональной корректности было завершено в 2009 году. Кляйн, Гервин; Эльфинстон, Кевин; Хайзер, Гернот ; Андроник, июнь; Кок, Дэвид; Деррин, Филип; Элькадуве, Дхаммика; Энгельхардт, Кай; Колански, Рафаль; Норриш, Майкл; Сьюэлл, Томас; Тач, Харви; Уинвуд, Саймон (октябрь 2009 г.). «seL4: формальная проверка ядра ОС» (PDF) . 22-й симпозиум ACM по принципам работы операционных систем . Биг Скай, Монтана, США.
^ «Почему созвездие использует Haskell» . Созвездие . Проверено 30 сентября 2023 г.
^ "Веб/Фреймворки - HaskellWiki" . wiki.haskell.org . Проверено 17 сентября 2022 г.
^ Ян-Виллем Мессен. Eager Haskell: выполнение с ограничением ресурсов обеспечивает эффективную итерацию . Материалы семинара SIGPLAN Ассоциации вычислительной техники (ACM) 2002 года по Haskell.
↑ Роберт Харпер (25 апреля 2011 г.). «Точка лени».
^ Роберт Харпер (16 апреля 2011 г.). «Модули важнее всего».
^ «Решение Кабал-Ада». www.yesodweb.com . Проверено 11 августа 2019 г.
^ «Анонсируем новую сборку клики: локальные сборки в стиле Nix» . Проверено 1 октября 2019 г.
^ https://zfoh.ch/
^ "Хакатон - HaskellWiki" .
Библиография
Отчеты
Пейтон Джонс, Саймон , изд. (2003). Язык Haskell 98 и библиотеки: пересмотренный отчет. Издательство Кембриджского университета. ISBN 978-0521826143.
Марлоу, Саймон , изд. (2010). Отчет о языке Haskell 2010 (PDF) . Хаскелл.орг.
Учебники
Дэви, Энтони (1992). Введение в системы функционального программирования с использованием Haskell . Издательство Кембриджского университета. ISBN 978-0-521-25830-2.
Берд, Ричард (1998). Введение в функциональное программирование с использованием Haskell (2-е изд.). Прентис Холл Пресс. ISBN 978-0-13-484346-9.
Худак, Пол (2000). Школа экспрессии Haskell: изучение функционального программирования с помощью мультимедиа. Нью-Йорк: Издательство Кембриджского университета. ISBN 978-0521643382.
Хаттон, Грэм (2007). Программирование на Хаскеле. Издательство Кембриджского университета. ISBN 978-0521692694.
О'Салливан, Брайан; Стюарт, Дон; Герцен, Джон (2008). Реальный мир Haskell . Севастополь: О'Рейли. ISBN 978-0-596-51498-3.Реальный мир Haskell (полный текст).
Томпсон, Саймон (2011). Haskell: Искусство функционального программирования (3-е изд.). Аддисон-Уэсли. ISBN 978-0201882957.
Липовача, Миран (апрель 2011 г.). Изучите Haskell во благо! . Сан-Франциско: Пресса без крахмала. ISBN 978-1-59327-283-8.(полный текст)
Берд, Ричард (2014). Функциональное мышление с помощью Haskell . Издательство Кембриджского университета. ISBN 978-1-107-45264-0.
Худак, Павел ; Петерсон, Джон; Фазель, Джозеф (июнь 2000 г.). «Нежное введение в Haskell, версия 98». Хаскелл.орг .
Изучите Haskell во благо! — Версия сообщества ( learnyouahaskell.github.io) . Актуальная версия известного руководства «Изучите Haskell» (LYAH), поддерживаемая сообществом.
Доме, Хэл III. «Еще один учебник по Haskell» (PDF) . {{cite journal}}: Требуется цитирование журнала |journal=( помощь ). Предполагается гораздо меньше предварительных знаний, чем официальное руководство.
Йоргей, Брент (12 марта 2009 г.). «Типклассопедия» (PDF) . Монада.Читатель (13): 17–68.
Магуайр, Сэнди (2018). Мышление типами: программирование на уровне типов на Haskell.