Хаскелл
Haskell ( / ˈ h æ s k əl / [25] ) — общего назначения статически типизированный язык чисто функциональный программирования с выводом типа и ленивым вычислением . [26] [27] Созданный для обучения, исследований и промышленного применения, Haskell впервые ввел ряд функций языка программирования, таких как классы типов , которые обеспечивают типобезопасную перегрузку операторов , и монадический ввод/вывод (IO). Он назван в честь логика Хаскелла Карри . [1] Основной реализацией Haskell является компилятор Glasgow Haskell (GHC).
Haskell Семантика исторически основана на семантике языка программирования Miranda , который служил для сосредоточения усилий первоначальной рабочей группы Haskell. [28] Последняя официальная спецификация языка была сделана в июле 2010 года, в то время как разработка GHC продолжает расширять Haskell за счет языковых расширений.
Haskell используется в научных кругах и промышленности. [29] [30] [31] По состоянию на май 2021 г. [update], Haskell занял 28-е место по популярности языка программирования по результатам поиска учебных пособий в Google. [32] и составлял менее 1% активных пользователей в репозитории исходного кода GitHub . [33]
История [ править ]
После выпуска Miranda компанией Research Software Ltd. в 1985 году интерес к ленивым функциональным языкам вырос. К 1987 году существовало более дюжины нестрогих , чисто функциональных языков программирования. Miranda использовалась наиболее широко, но это было проприетарное программное обеспечение . На конференции по функциональным языкам программирования и компьютерной архитектуре (FPCA '87) в Портленде, штат Орегон , было достигнуто твердое согласие о создании комитета для определения открытого стандарта для таких языков. Целью комитета было объединить существующие функциональные языки в один, который послужит основой для будущих исследований в области проектирования функциональных языков. [34]
Haskell 1.0–1.4 [ править ]
Haskell был разработан комитетом, пытавшимся по возможности объединить готовые решения.
Классы типов , которые обеспечивают типобезопасную перегрузку операторов , были впервые предложены Филипом Уодлером и Стивеном Блоттом для решения специальной обработки типов равенства и арифметической перегрузки в языках того времени. [35]
В ранних версиях 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).
Хаскель 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 (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 было изменено для устранения непредвиденных синтаксических ошибок.
- The
LANGUAGE
прагма была указана . К 2010 году широко использовались десятки расширений языка, и GHC (среди других компиляторов) предоставилLANGUAGE
прагма для указания отдельных расширений со списком идентификаторов. Компиляторы Haskell 2010 должны поддерживатьHaskell2010
Расширение и рекомендуется поддерживать несколько других, которые соответствуют расширениям, добавленным в Haskell 2010.
Будущие стандарты
Следующая официальная спецификация была запланирована на 2020 год. [3] 29 октября 2021 года в версии GHC 9.2.1 было выпущено расширение GHC2021. Хотя это не формальная спецификация языка, она объединяет ряд стабильных и широко используемых расширений GHC для Haskell 2010. [39] [40]
Особенности [ править ]
В Haskell реализованы ленивые вычисления , лямбда-выражения , сопоставление с образцом , понимание списков , классы типов и полиморфизм типов . Это чисто функциональный язык , что означает, что функции обычно не имеют побочных эффектов . Существует отдельная конструкция для представления побочных эффектов, ортогональная типу функции. Чистая функция может возвращать побочный эффект, который впоследствии выполняется, моделируя нечистые функции других языков.
Haskell имеет строгую статическую систему типов , основанную на выведении типа Хиндли-Милнера . Его основным нововведением в этой области являются классы типов, изначально задуманные как принципиальный способ добавления перегрузки в язык. [41] но с тех пор нашел гораздо больше применений. [42]
Конструкция, представляющая побочные эффекты, является примером монады : общей структуры, которая может моделировать различные вычисления, такие как обработка ошибок, недетерминизм , синтаксический анализ и программная транзакционная память . Они определяются как обычные типы данных, но Haskell предоставляет некоторый синтаксический сахар для их использования.
Haskell имеет открытую опубликованную спецификацию. [27] и существует множество реализаций . Его основная реализация, компилятор Glasgow Haskell (GHC), является одновременно интерпретатором и собственного кода компилятором , который работает на большинстве платформ. GHC известен своей богатой системой типов, включающей последние инновации, такие как обобщенные алгебраические типы данных и семейства типов. Игра Computer Language Benchmarks Game также подчеркивает высокопроизводительную реализацию параллелизма и параллелизма . [43]
доступно более 5400 сторонних библиотек и инструментов с открытым исходным кодом Вокруг языка существует активное, растущее сообщество, и в онлайн-репозитории пакетов Hackage . [44]
Примеры кода [ править ]
« Привет, мир!» программа на Haskell (строго обязательна только последняя строка):
module Main (main) where -- not needed in interpreter, is the default in a module file
main :: IO () -- the compiler can infer this type definition
main = putStrLn "Hello, World!"
Функция факториал в Haskell определяется несколькими разными способами (первая строка — это аннотация типа , которая не является обязательной и одинаковой для каждой реализации):
factorial :: (Integral a) => a -> a
-- Using recursion (with the "ifthenelse" expression)
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
Haskell Использование комбинатора с фиксированной точкой позволяет написать эту функцию без какой-либо явной рекурсии.
import Data.Function (fix)
factorial = fix fac
where fac f x
| x < 2 = 1
| otherwise = x * f (x - 1)
Поскольку тип Integer имеет произвольную точность , этот код будет вычислять такие значения, как factorial 100000
(число из 456 574 цифр) без потери точности.
Реализация алгоритма, аналогичного быстрой сортировке списков, где в качестве опорного принимается первый элемент:
-- Type annotation (optional, same for each implementation)
quickSort :: Ord a => [a] -> [a]
-- Using list comprehensions
quickSort [] = [] -- The empty list is already sorted
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] -- Sort the right part of the list
-- Using filter
quickSort [] = []
quickSort (x:xs) = quickSort (filter (<x) xs)
++ [x] ++
quickSort (filter (>=x) xs)
Реализации [ править ]
Все перечисленные реализации распространяются по лицензиям с открытым исходным кодом . [45]
Реализации, которые полностью или почти соответствуют стандарту 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, включают:
- Эта и Фреге — это диалекты Haskell, предназначенные для виртуальной машины Java .
- 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 — это инструмент для преобразования одного формата разметки в другой.
- Pugs — это компилятор и интерпретатор языка Raku программирования (ранее Perl 6).
- TidalCycles — это специальный язык для живого кодирования музыкальных шаблонов, встроенный в Haskell. [54]
- Xmonad — оконный менеджер для X Window System , полностью написанный на Haskell. [55]
- ГарганТекст [56] это инструмент для совместной работы для отображения текстов семантического анализа в любом веб-браузере , полностью написанный на Haskell и PureScript , который используется, например, в исследовательском сообществе для составления современных отчетов и дорожных карт. [57]
Промышленность [ править ]
- Bluespec SystemVerilog (BSV) — это язык проектирования полупроводников, являющийся расширением Haskell. Кроме того, инструменты Bluespec, Inc. реализованы на Haskell. Обратите внимание, что это пример предметно-ориентированного языка, встроенного в Haskell.
- Cryptol — язык и набор инструментов для разработки и проверки алгоритмов шифрования , реализован на Haskell.
- Facebook внедряет свои программы по борьбе со спамом [58] в Haskell, поддерживая базовую библиотеку доступа к данным как программное обеспечение с открытым исходным кодом . [59]
- Блокчейн- платформа Cardano реализована на Haskell. [60]
- GitHub реализовал Semantic , библиотеку с открытым исходным кодом для анализа, сравнения и интерпретации ненадежного исходного кода на Haskell. [61]
- Язык финансового моделирования Mu компании Standard Chartered представляет собой синтаксический язык Haskell, работающий в строгой среде выполнения. [62]
- seL4 , первое официально проверенное микроядро , [63] использовал Haskell в качестве языка прототипирования для разработчика ОС. [63] : стр.2 В то же время код Haskell определял исполняемую спецификацию, с помощью которой можно было рассуждать для автоматического перевода с помощью инструмента доказательства теорем. [63] : стр.3 Таким образом, код Haskell служил промежуточным прототипом перед окончательной C. доработкой [63] : стр.3
- Программное обеспечение для оптимизации цепочки поставок целевых магазинов написано на Haskell. [64]
- коллега по фильму [65]
Интернет [ править ]
Известные веб-фреймворки, написанные для Haskell, включают: [66]
Критика [ править ]
Ян-Виллем Массен в 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, но с разными системами типов, в том числе:
- Agda — функциональный язык с зависимыми типами .
- Кайенский , с зависимыми типами.
- Elm — функциональный язык для создания интерфейсных веб-приложений, без поддержки высшего типа классов или экземпляров пользовательских типов или типов .
- Epigram — функциональный язык с зависимыми типами, подходящий для доказательства свойств программ.
- Idris — функциональный язык общего назначения с зависимыми типами, разработанный в Университете Сент-Эндрюс .
- PureScript транслируется в JavaScript.
- Ωmega — строгий язык, позволяющий вводить новые виды и программировать на уровне типов.
Другие родственные языки включают:
- Curry — язык функционального/логического программирования, основанный на Haskell.
Известные варианты Haskell включают:
- Generic Haskell — версия Haskell с поддержкой системы типов для универсального программирования .
- Hume — строгий функциональный язык для встраиваемых систем , основанный на процессах в виде автоматов без сохранения состояния в своего рода кортежах одноэлементных каналов почтовых ящиков, где состояние сохраняется посредством обратной связи с почтовыми ящиками, а описание отображения выходов на каналы — в виде коробочной проводки, с Haskell-подобный язык выражений и синтаксис.
Конференции и семинары [ править ]
Сообщество Haskell регулярно встречается для проведения исследований и разработок. Основные события:
- Международная конференция по функциональному программированию (ICFP)
- Симпозиум Haskell (ранее Haskell Workshop)
- Семинар разработчиков Haskell
- Коммерческие пользователи функционального программирования (CUFP)
- ЗуриХак, [78] своего рода хакатон, проводимый каждый год в Цюрихе
Начиная с 2006 года проводится серия организованных хакатонов серии Hac, направленных на улучшение инструментов и библиотек языков программирования. [79]
Ссылки [ править ]
- ^ Jump up to: Перейти обратно: а б с Худак и др. 2007 .
- ^ Jump up to: Перейти обратно: а б Марлоу, Саймон (24 ноября 2009 г.). «Анонс Haskell 2010» . Haskell (список рассылки) . Проверено 12 марта 2011 г.
- ^ Jump up to: Перейти обратно: а б Ридель, Герберт (28 апреля 2016 г.). «ANN: Сформирован комитет Haskell Prime 2020» . Haskell-prime (список рассылки) . Проверено 6 мая 2017 г.
- ^ Jump up to: Перейти обратно: а б с д и ж г час я дж к л м Пейтон Джонс 2003 , с. xi
- ^ Норелл, Ульф (2008). «Зависимо типизированное программирование в Agda» (PDF) . Гетеборг: Университет Чалмерса . Проверено 9 февраля 2012 года .
- ^ Худак и др. 2007 , стр. 12–38, 43.
- ^ Страуструп, Бьярне ; Саттон, Эндрю (2011). «Проектирование концептуальных библиотек для C++» (PDF) . Языковая инженерия программного обеспечения . Архивировано из оригинала (PDF) 10 февраля 2012 года.
- ^ Jump up to: Перейти обратно: а б с д и ж г час я дж Худак и др. 2007 , стр. 12–45–46.
- ^ Jump up to: Перейти обратно: а б Мейер, Эрик (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 г.
- ^ Кучлинг А.М. «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 г.
- ^ Вывод типа, первоначально использовавший вывод типа Хиндли-Милнера.
- ^ Jump up to: Перейти обратно: а б с Пейтон Джонс, 2003 год .
- ^ Эдвард Кметт, Эдвард Кметт - Типовые классы против мира
- ^ Моссберг, Эрик (8 июня 2020 г.), erkmos/haskell-company , дата обращения 22 июня 2020 г.
- ^ О'Салливан, Брайан; Герцен, Джон; Стюарт, Дональд Брюс (15 ноября 2008 г.). Реальный мир Haskell: код, в который можно поверить . «О'Рейли Медиа, Инк.». стр. xxviii – xxxi. ISBN 978-0-596-55430-9 .
- ^ «Haskell в производстве: Книга рисков» . Компания по разработке программного обеспечения Serokell . Проверено 7 сентября 2021 г.
- ^ «Индекс популярности языков программирования PYPL» . pypl.github.io . Май 2021 г. Архивировано из оригинала 7 мая 2021 г. Проверено 16 мая 2021 г.
- ^ Фредериксон, Бен. «Рейтинг языков программирования по пользователям GitHub» . www.benfrederickson.com . Проверено 6 сентября 2019 г.
- ^ Jump up to: Перейти обратно: а б с Пейтон Джонс 2003 , Предисловие.
- ^ Уодлер, Филип (октябрь 1988 г.). «Как сделать специальный полиморфизм менее специальным» .
- ^ Пейтон Джонс, Саймон (2003). «Власяница: ретроспектива Haskell» . Майкрософт .
- ^ «Haskell Wiki: Реализации» . Проверено 18 декабря 2012 г.
- ^ «Добро пожаловать в Хаскель » . 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 . ISBN 978-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 октября.
- ^ «Кабала Хаскелла» . Проверено 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 г.
- ^ Jump up to: Перейти обратно: а б с д Формальное доказательство функциональной корректности было завершено в 2009 году. Кляйн, Гервин; Эльфинстон, Кевин; Хайзер, Гернот ; Андроник, июнь; Кок, Дэвид; Деррин, Филип; Элькадуве, Дхаммика; Энгельхардт, Кай; Колански, Рафаль; Норриш, Майкл; Сьюэлл, Томас; Тач, Харви; Уинвуд, Саймон (октябрь 2009 г.). «seL4: формальная проверка ядра ОС» (PDF) . 22-й симпозиум ACM по принципам работы операционных систем . Биг Скай, Монтана, США.
- ^ «Тихон Джелвис: Haskell у цели» . Ютуб .
- ^ «Почему Co-Star использует Haskell» . Созвездие . Проверено 30 сентября 2023 г.
- ^ «Веб/фреймворки – HaskellWiki» . wiki.haskell.org . Проверено 17 сентября 2022 г.
- ^ Ян-Виллем Мессен. Eager Haskell: выполнение с ограничением ресурсов обеспечивает эффективную итерацию . Материалы семинара SIGPLAN Ассоциации вычислительной техники (ACM) 2002 года по Haskell.
- ^ [ мертвая ссылка ] Саймон Пейтон Джонс. Ношение власяницы: ретроспектива по Haskell . Приглашенный доклад на POPL 2003.
- ^ «Ленивая оценка может привести к отличной производительности, как, например, в игре «The Computer Language Benchmarks Game» . 27 июня 2006 г.
- ^ Господа, Бастиан; Лейен, Даан; ван Эйзендорн, Арьян (2003). «Гелий для изучения Haskell» (PDF) . Материалы семинара ACM SIGPLAN 2003 года по Haskell . стр. 62–71. дои : 10.1145/871895.871902 . ISBN 1581137583 . S2CID 11986908 .
- ^ «Документация по компилятору гелия» . Гитхаб . Проверено 9 июня 2023 г.
- ^ «DDC – HaskellWiki» . Хаскелл.орг. 3 декабря 2010 года . Проверено 26 июня 2013 г.
- ^ Бен Липпмайер, Вывод типов и оптимизация для нечистого мира , Австралийский национальный университет (2010), докторская диссертация, глава 1
- ^ Роберт Харпер (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 .
- Бёрд, Ричард ; Гиббонс, Джереми (июль 2020 г.). Проектирование алгоритмов на Haskell . Издательство Кембриджского университета. ISBN 978-1-108-49161-7 .
- Учебники
- Худак, Павел ; Петерсон, Джон; Фазель, Джозеф (июнь 2000 г.). «Нежное введение в Haskell, версия 98» . Хаскелл.орг .
- Изучите Haskell во благо! - Версия сообщества ( learnyouahaskell.github.io ) . Актуальная версия известного руководства «Изучите Haskell» (LYAH), поддерживаемая сообществом.
- Доме, Хэл III. «Еще один учебник по Haskell» (PDF) .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) Предполагает гораздо меньше предварительных знаний, чем официальное руководство. - Йоргей, Брент (12 марта 2009 г.). «Типклассопедия» (PDF) . Монада.Читатель (13): 17–68.
- Магуайр, Сэнди (2018). Мышление типами: программирование на уровне типов на Haskell .
- История
- Худак, Павел ; Хьюз, Джон ; Пейтон Джонс, Саймон ; Уодлер, Филип (2007). «История Haskell» (PDF) . Материалы третьей конференции ACM SIGPLAN по истории языков программирования . стр. 12–1–55. дои : 10.1145/1238844.1238856 . ISBN 978-1-59593-766-7 . S2CID 52847907 .
- Гамильтон, Наоми (19 сентября 2008 г.). «А-Я языков программирования: Haskell» . Компьютерный мир .
Внешние ссылки [ править ]
- Академические языки программирования
- Образовательные языки программирования
- Функциональные языки
- Семейство языков программирования Haskell
- Грамотное программирование
- Языки программирования сопоставления шаблонов
- Языки программирования, созданные в 1990 году.
- Статически типизированные языки программирования