Семантика 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 взаимодействие с пользователем и ввод/вывод (IO) обрабатывались как потоковыми, так и продолженными механизмами, которые широко считались неудовлетворительными. [36] В версии 1.3 был введен монадический IO, а также обобщение классов типов до более высоких видов (конструкторы типов). Вместе с «нотацией do», которая предоставляет синтаксический сахар для класса типов Monad, это дало Haskell систему эффектов, которая поддерживала ссылочную прозрачность и была удобной.
Другими заметными изменениями в ранних версиях стали подход к функции «seq», которая создает зависимость данных между значениями и используется в ленивых языках для предотвращения чрезмерного потребления памяти; при этом она перешла от класса типов к стандартной функции, что сделало рефакторинг более практичным.
Первая версия Haskell («Haskell 1.0») была определена в 1990 году. [1] Усилия комитета привели к появлению ряда определений языка (1.0, 1.1, 1.2, 1.3, 1.4).
Хаскелл 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) больше не допускались. Этот синтаксический сахар имел вводящую в заблуждение семантику, в которой код выглядел так, как будто он использовал (+)оператор , но на самом деле был десахаризирован до кода с использованием (-)и (>=).
Правила вывода типов были смягчены, чтобы позволить большему количеству программ выполнять проверку типов.
Прагма была определена. К 2010 году десятки расширений языка были широко распространены, и GHC (среди других компиляторов) предоставил прагму для указания отдельных расширений со списком идентификаторов. Компиляторы Haskell 2010 обязаны поддерживать это расширение и поощряются к LANGUAGEподдержке нескольких других, которые соответствуют расширениям, добавленным в Haskell 2010.LANGUAGEHaskell2010
Будущие стандарты
Следующая формальная спецификация была запланирована на 2020 год. [3] 29 октября 2021 года с версией GHC 9.2.1 было выпущено расширение GHC2021. Хотя это не формальная языковая спецификация, она объединяет несколько стабильных, широко используемых расширений GHC для Haskell 2010. [39] [40]
Haskell имеет сильную , статическую систему типов, основанную на выводе типов Хиндли-Милнера . Его главное новшество в этой области — классы типов, изначально задуманные как принципиальный способ добавления перегрузки в язык, [41] но с тех пор нашедшие множество других применений. [42]
Конструкция, представляющая побочные эффекты, является примером монады : общей структуры, которая может моделировать различные вычисления, такие как обработка ошибок, недетерминизм , синтаксический анализ и программная транзакционная память . Они определяются как обычные типы данных, но Haskell предоставляет некоторый синтаксический сахар для их использования.
Вокруг языка существует активное, растущее сообщество, и более 5400 сторонних библиотек и инструментов с открытым исходным кодом доступны в онлайн-репозитории пакетов Hackage . [44]
Примеры кода
Программа «Hello, World!» на языке Haskell (строго необходима только последняя строка):
module Main ( main ) где -- не требуется в интерпретаторе, является значением по умолчанию в файле модуляmain :: IO () — компилятор может вывести это определение типа main = putStrLn "Hello, World!"
Функция факториала в Haskell, определенная несколькими различными способами (первая строка — это аннотация типа , которая необязательна и одинакова для каждой реализации):
факториал :: ( интеграл a ) => a -> a-- Используя рекурсию (с выражением "ifthenelse") факториал n = если n < 2 , то 1 , иначе n * факториал ( n - 1 )-- Используя рекурсию (с сопоставлением с образцом) факториал 0 = 1 факториал n = n * факториал ( n - 1 )-- Используя рекурсию (с защитой) факториал n | n < 2 = 1 | в противном случае = n * факториал ( n - 1 )-- Используя список и функцию «произведение» факториал n = произведение [ 1 .. n ]-- Используя fold (реализует "произведение") factorial n = foldl ( * ) 1 [ 1 .. n ]-- Факториал в стиле без точек = foldr ( * ) 1 . enumFromTo 1
импортировать Data.Function ( исправить )факториал = исправить fac , где fac f x | 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 ] -- Сортировка правой части списка-- Использование фильтра quickSort [] = [] quickSort ( x : xs ) = quickSort ( filter ( < x ) xs ) ++ [ x ] ++ quickSort ( filter ( >= x ) xs )
Реализации, которые полностью или почти соответствуют стандарту Haskell 98, включают в себя:
Компилятор Glasgow Haskell (GHC) компилирует в машинный код на многих различных архитектурах процессоров и в ANSI C через один из двух промежуточных языков : C-- или, в более поздних версиях, биткод LLVM (ранее Low Level Virtual Machine). [46] [47] GHC стал фактическим стандартом диалекта Haskell. [48] Существуют библиотеки (например, привязки к OpenGL ), которые работают только с GHC. GHC также распространялся с платформой Haskell .
Jhc, компилятор Haskell, написанный Джоном Мичемом, делает упор на скорость и эффективность генерируемых программ, а также на исследование новых преобразований программ.
Ajhc — это ответвление Jhc.
Utrecht Haskell Compiler (UHC) — это реализация Haskell из Утрехтского университета . [49] Он поддерживает почти все возможности Haskell 98, а также множество экспериментальных расширений. Он реализован с использованием атрибутных грамматик и в основном используется для исследований в области систем сгенерированных типов и расширений языка.
Реализации, которые больше не поддерживаются активно, включают:
Haskell User's Gofer System ( Hugs ) — это интерпретатор байт-кода . Когда-то это была одна из наиболее широко используемых реализаций, наряду с компилятором GHC, [50] , но теперь ее в основном заменил GHCi. Она также поставляется с графической библиотекой.
HBC — это ранняя реализация, поддерживающая Haskell 1.4. Она была реализована Леннартом Аугустссоном в Lazy ML и основана на нем . Она не развивалась активно в течение некоторого времени.
nhc98 — компилятор байт-кода, ориентированный на минимизацию использования памяти.
York Haskell Compiler ( Yhc ) был ответвлением nhc98, с целью быть проще, более портативным и эффективным, и интегрировать поддержку Hat, трассировщика Haskell. Он также имел бэкэнд JavaScript , позволяя пользователям запускать программы Haskell в веб-браузерах .
Реализации, не полностью соответствующие Haskell 98 и использующие вариант языка Haskell, включают:
Gofer — это образовательный диалект Haskell с функцией, называемой конструкторскими классами , разработанный Марком Джонсом. Он вытеснен Haskell User's Gofer System (Hugs).
Helium, новый диалект Haskell. Основное внимание уделяется упрощению обучения с помощью более понятных сообщений об ошибках путем отключения классов типов по умолчанию.
Известные приложения
Agda — это помощник по доказательству, написанный на языке Haskell. [51]
Cabal — это инструмент для создания и упаковки библиотек и программ на языке Haskell. [52]
Darcs — это система контроля версий, написанная на языке Haskell, с несколькими инновационными функциями, такими как более точный контроль применяемых исправлений.
Компилятор Glasgow Haskell (GHC) также часто используется в качестве испытательного полигона для расширенных функций функционального программирования и оптимизаций в других языках программирования.
Git-annex — это инструмент для управления (большими) файлами данных под контролем версий Git . Он также предоставляет распределенную систему синхронизации файлов (помощник git-annex).
Linspire Linux выбрал Haskell для разработки системных инструментов. [53]
Pandoc — это инструмент для преобразования одного формата разметки в другой.
GarganText [56] — это совместный инструмент для отображения текстов с помощью семантического анализа в любом веб-браузере , полностью написанный на Haskell и PureScript , который используется, например, в исследовательском сообществе для составления современных отчетов и дорожных карт. [57]
Блокчейн- платформа Cardano реализована на языке Haskell. [60]
GitHub реализовал Semantic, библиотеку с открытым исходным кодом для анализа, сравнения и интерпретации ненадежного исходного кода на языке Haskell. [61]
seL4 , первое формально проверенное микроядро , [63] использовало Haskell в качестве языка прототипирования для разработчика ОС. [63] : стр.2 В то же время код Haskell определял исполняемую спецификацию, с помощью которой можно было рассуждать, для автоматического перевода инструментом доказательства теорем. [63] : стр.3 Таким образом, код Haskell служил промежуточным прототипом перед окончательной доработкой на языке C. [63] : стр.3
Ян-Виллем Мессен в 2002 году и Саймон Пейтон Джонс в 2003 году обсуждали проблемы, связанные с ленивыми вычислениями, а также признавали их теоретические мотивы. [68] [69] В дополнение к чисто практическим соображениям, таким как улучшение производительности, [70] они отмечают, что ленивые вычисления затрудняют для программистов оценку производительности их кода (в частности, использование им памяти).
Бастиан Херен, Даан Лейен и Арьян ван Эйзендорн в 2003 году также отметили некоторые препятствия для изучающих Haskell: «Тонкий синтаксис и сложная система типов Haskell — это палка о двух концах, высоко ценимая опытными программистами, но также являющаяся источником разочарования для новичков, поскольку общность Haskell часто приводит к загадочным сообщениям об ошибках». [71] Для решения проблемы сообщений об ошибках исследователи из Утрехтского университета разработали усовершенствованный интерпретатор под названием Helium, который улучшил удобство сообщений об ошибках, ограничив общность некоторых функций Haskell. В частности, он по умолчанию отключает классы типов. [72]
Бен Липпмейер разработал Disciple [73] как строгий по умолчанию (ленивый по явной аннотации) диалект Haskell с системой типов и эффектов, чтобы решить трудности Haskell в рассуждениях о ленивых вычислениях и в использовании традиционных структур данных, таких как изменяемые массивы. [74] Он утверждает (стр. 20), что «деструктивное обновление предоставляет программисту два важных и мощных инструмента... набор эффективных структур данных, подобных массивам, для управления коллекциями объектов и... возможность транслировать новое значение всем частям программы с минимальной нагрузкой на программиста».
Роберт Харпер , один из авторов Standard ML, привел свои причины не использовать Haskell для обучения вводному программированию. Среди них — сложность рассуждений об использовании ресурсов с нестрогой оценкой, то, что ленивая оценка усложняет определение типов данных и индуктивное рассуждение, [75] и «неполноценность» (старой) системы классов Haskell по сравнению с системой модулей ML. [76]
Инструмент сборки Haskell, Cabal , исторически критиковался за плохую обработку нескольких версий одной и той же библиотеки, проблема, известная как «Cabal hell». Сервер Stackage и инструмент сборки Stack были созданы в ответ на эту критику. [77] Сам Cabal теперь имеет гораздо более сложную систему сборки, в значительной степени вдохновленную Nix , [78] которая стала системой по умолчанию с версии 3.0.
Родственные языки
Clean — близкий, немного более старый родственник Haskell. Его самое большое отклонение от Haskell заключается в использовании типов уникальности вместо монад для ввода/вывода (I/O) и побочных эффектов.
Был разработан ряд языков, вдохновленных Haskell, но с другими системами типов, в том числе:
Hume , строгий функциональный язык для встраиваемых систем , основанный на процессах как на автоматах без состояния над своего рода кортежами одноэлементных каналов почтовых ящиков, где состояние сохраняется с помощью обратной связи в почтовых ящиках, и описание отображения выходов в каналы как проводки ящиков, с языком выражений и синтаксисом, подобными Haskell.
Конференции и семинары
Сообщество Haskell регулярно встречается для проведения исследований и разработок. Основные события:
ZuriHac, [79] вид хакатона, который проводится каждый год в Цюрихе
Начиная с 2006 года, была проведена серия организованных хакатонов , серия Hac, направленных на улучшение инструментов и библиотек языка программирования. [80]
Ссылки
^ abc Худак и др. 2007.
^ ab Marlow, Simon (24 ноября 2009 г.). "Announcing Haskell 2010". Haskell (Mailing list) . Получено 12 марта 2011 г.
^ ab Riedel, Herbert (28 апреля 2016 г.). "ANN: Haskell Prime 2020 Committee has generated". Haskell-prime (Mailing list) . Получено 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.
^ ab Meijer, Erik (2006). «Исповедь продавца подержанных языков программирования: как подсадить массы на Haskell». Oopsla 2007. CiteSeerX 10.1.1.72.868 .
^ Мейер, Эрик (1 октября 2009 г.). «Лекции C9: д-р Эрик Мейер – Основы функционального программирования, глава 1 из 13». Channel 9 . Microsoft. Архивировано из оригинала 16 июня 2012 г. . Получено 9 февраля 2012 г. .
^ Дроби, Садек (4 марта 2009 г.). «Эрик Мейер о LINQ». InfoQ . QCon SF 2008: C4Media Inc . Получено 9 февраля 2012 г. .{{cite news}}: CS1 maint: местоположение ( ссылка )
^ Хики, Рич. "Clojure Bookshelf". Listmania! . Архивировано из оригинала 3 октября 2017 г. . Получено 3 октября 2017 г. .
^ Хеллер, Мартин (18 октября 2011 г.). «Отверните нос от Dart и почувствуйте запах CoffeeScript». InfoWorld . Получено 15 июля 2020 г.
^ "Декларативное программирование в Escher" (PDF) . Получено 7 октября 2015 г.
^ Syme, Don ; Granicz, Adam; Cisternino, Antonio (2007). Expert F# . Apress . стр. 2. F# также черпает вдохновение из Haskell, особенно в отношении двух расширенных языковых функций, называемых выражениями последовательностей и рабочими процессами .
^ «Facebook представляет «Hack» — язык программирования будущего». WIRED . 20 марта 2014 г.
^ "Идрис, язык с зависимой типизацией" . Получено 26 октября 2014 г.
^ "LiveScript Inspiration" . Получено 4 февраля 2014 г. .
^ Freeman, Phil (2016). "PureScript by Example". Leanpub . Получено 23 апреля 2017 г.
^ Кухлинг, AM "Functional Programming HOWTO". Документация Python v2.7.2 . Python Software Foundation . Получено 9 февраля 2012 г.
^ "Глоссарий терминов и жаргонизмов". Perl Foundation Perl 6 Wiki . Perl Foundation . Архивировано из оригинала 21 января 2012 года . Получено 9 февраля 2012 года .
^ "Влияния - The Rust Reference". The Rust Reference . Получено 31 декабря 2023 г. .
^ Фогус, Майкл (6 августа 2010 г.). "MartinOdersky take(5) toList". Отправить еще парамедиков . Получено 9 февраля 2012 г.
^ Lattner, Chris (3 июня 2014 г.). "Домашняя страница Криса Латтнера". Крис Латтнер . Получено 3 июня 2014 г. Язык Swift является продуктом неустанных усилий команды экспертов по языку, гуру документации, ниндзя оптимизации компиляторов и невероятно важной внутренней группы по догфудингу, которая предоставляла обратную связь, чтобы помочь отточить и проверить идеи в бою. Конечно, он также значительно выиграл от опыта, полученного с трудом многими другими языками в этой области, черпая идеи из Objective-C, Rust, Haskell, Ruby, Python, C#, CLU и слишком многих других, чтобы перечислить их.
↑ Шевалье, Тим (28 января 2008 г.). «кто-нибудь может сказать мне, как произносится «хаскелл»?». Haskell-cafe (список рассылки) . Получено 12 марта 2011 г.
^ Эдвард Кметт, Эдвард Кметт – Классы типов против мира
^ Моссберг, Эрик (8 июня 2020 г.), erkmos/haskell-companies , получено 22 июня 2020 г.
↑ О'Салливан, Брайан; Герцен, Джон; Стюарт, Дональд Брюс (15 ноября 2008 г.). Реальный мир Haskell: код, в который можно верить. «O'Reilly Media, Inc.». стр. xxviii–xxxi. ISBN978-0-596-55430-9.
^ "Haskell in Production: Riskbook". Serokell Software Development Company . Получено 7 сентября 2021 г.
^ "PYPL PopularitY of Programming Language index". pypl.github.io . Май 2021. Архивировано из оригинала 7 мая 2021 . Получено 16 мая 2021 .
^ Фредериксон, Бен. «Рейтинг языков программирования по версии пользователей GitHub». www.benfrederickson.com . Получено 6 сентября 2019 г. .
^ abc Пейтон Джонс 2003, Предисловие.
^ Вадлер, Филип (октябрь 1988 г.). «Как сделать полиморфизм ad hoc менее ad hoc».
^ Пейтон Джонс, Саймон (2003). «Власяница: ретроспектива Haskell». Microsoft .
^ "Haskell Wiki: Реализации" . Получено 18 декабря 2012 г.
^ "Welcome to Haskell'". Haskell' Wiki . Архивировано из оригинала 20 февраля 2016 года . Получено 11 февраля 2016 года .
↑ Команда GHC 2020 (29 октября 2021 г.) Выпущен GHC 9.2.1
^ Предлагаемые изменения компилятора и языка для GHC и GHC/Haskell
^ Wadler, P.; Blott, S. (1989). "Как сделать ad-hoc полиморфизм менее ad hoc". Труды 16-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования - POPL '89 . ACM . С. 60–76. doi : 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 Backend". GHC Trac . 29 марта 2019 г.
^ Terei, David A.; Chakravarty, Manuel MT (2010). «Бэкэнд LLVM для GHC». Труды симпозиума ACM SIGPLAN Haskell 2010. ACM Press.
^ C. Ryder и S. Thompson (2005). «Портирование HaRe в API GHC»
^ Утрехтский компилятор Haskell
^ Худак и др. 2007, стр. 12–22.
↑ Agda 2, Сообщество Agda Github, 15 октября 2021 г. , получено 16 октября 2021 г.
^ "The Haskell Cabal" . Получено 8 апреля 2015 г.
^ "Linspire/Freespire Core OS Team and Haskell". Список рассылки Debian Haskell . Май 2006. Архивировано из оригинала 27 декабря 2017. Получено 14 июня 2006 .
^ "Live code with Tidal Cycles". Tidal Cycles . Получено 19 января 2022 г. .
^ xmonad.org
^ "Gargantext – Main". 13 июля 2023 г.
^ Дэвид, Чавалариас и др. (8 мая 2023 г.). На пути к исследовательской повестке дня в области цифровых медиа и благополучия человечества (отчет).
^ «Борьба со спамом с помощью Haskell». Facebook Code . 26 июня 2015 г. Получено 11 августа 2019 г.
^ "Открытый исходный код Haxl, библиотеки для Haskell". Facebook Code . 10 июня 2014 г. Получено 11 августа 2019 г.
^ "input-output-hk/cardano-node: Основной компонент, который используется для участия в децентрализованном блокчейне Cardano". GitHub . Получено 18 марта 2022 г.
^ Разбор, анализ и сравнение исходного кода на многих языках: github/semantic, GitHub, 7 июня 2019 г. , получено 7 июня 2019 г.
^ "Отчет о семинаре коммерческих пользователей функционального программирования" (PDF) . Получено 10 июня 2022 г.
^ abcd Формальное доказательство функциональной корректности было завершено в 2009 году. Кляйн, Гервин; Элфинстоун, Кевин; Хейзер, Гернот ; Андроник, Джун; Кок, Дэвид; Деррин, Филипп; Элкадуве, Дхаммика; Энгельхардт, Кай; Колански, Рафал; Норриш, Майкл; Сьюэлл, Томас; Тач, Харви; Уинвуд, Саймон (октябрь 2009 г.). "seL4: Формальная проверка ядра ОС" (PDF) . 22-й симпозиум ACM по принципам операционных систем . Биг-Скай, Монтана, США.
^ "Тихон Джелвис: Haskell в Target". YouTube . 22 апреля 2017 г.
^ "Почему Co–Star использует Haskell". Co–Star . Получено 30 сентября 2023 г. .
^ "Haskell in Production: Mercury". Serokell . Получено 11 октября 2024 г. .
^ "Web/Frameworks – HaskellWiki". wiki.haskell.org . Получено 17 сентября 2022 г. .
^ Ян-Виллем Мессен. Нетерпеливый Хаскелл: ограниченное ресурсами выполнение дает эффективную итерацию . Труды семинара SIGPLAN Ассоциации вычислительной техники (ACM) 2002 года по Хаскеллу.
Дэви, Энтони (1992). Введение в системы функционального программирования с использованием Haskell . Cambridge University Press. ISBN 978-0-521-25830-2.
Bird, Richard (1998). Введение в функциональное программирование с использованием Haskell (2-е изд.). Prentice Hall Press. ISBN 978-0-13-484346-9.
Хадак, Пол (2000). Школа выражений Haskell: изучение функционального программирования с помощью мультимедиа. Нью-Йорк: Cambridge University Press. ISBN 978-0521643382.
Хаттон, Грэм (2007). Программирование на языке Haskell. Cambridge University Press. ISBN 978-0521692694.
О'Салливан, Брайан; Стюарт, Дон; Герцен, Джон (2008). Real World Haskell . Севастополь: O'Reilly. ISBN 978-0-596-51498-3.Real World Haskell (полный текст).
Томпсон, Саймон (2011). Haskell: The Craft of Functional Programming (3-е изд.). Addison-Wesley. ISBN 978-0201882957.
Липовача, Миран (апрель 2011 г.). Изучите Haskell ради великого блага! . Сан-Франциско: No Starch Press. ISBN 978-1-59327-283-8.(полный текст)
Хадак, Пол ; Петерсон, Джон; Фазель, Джозеф (июнь 2000 г.). «Нежное введение в Haskell, версия 98». Haskell.org .
Learn You a Haskell for Great Good! - версия сообщества ( learnyouahaskell.github.io ) . Актуальная версия известного руководства "Learn You a Haskell" (LYAH), поддерживаемая сообществом.
Доме, Хэл III. «Еще один учебник по Haskell» (PDF) . {{cite journal}}: Цитировать журнал требует |journal=( помощь ) Предполагает гораздо меньше предварительных знаний, чем официальное руководство.
Yorgey, Brent (12 марта 2009 г.). "The Typeclassopedia" (PDF) . The Monad.Reader (13): 17–68.
Магуайр, Сэнди (2018). Думаем типами: программирование на уровне типов в Haskell.