Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Хаскелл / ч æ s к əl / [27] является универсальным , статический типизированным , чисто функциональным языком программирования с умозаключением типа и ленивыми вычислениями . [28] [29] Разработанный, чтобы быть подходящим для обучения, исследований и промышленного применения, Haskell является пионером в использовании ряда передовых функций языка программирования, таких как классы типов , которые позволяют осуществлять безопасную перегрузку операторов . Основная реализация Haskell - компилятор Glasgow Haskell.(GHC). Он назван в честь логика Хаскелла Карри . [1]

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

Haskell используется в научных кругах [31] [32] и в промышленности. [33] [34] По состоянию на сентябрь 2020 года Haskell был 28-м по популярности языком программирования с точки зрения поиска в Google [35] учебных пособий и составлял менее 1% активных пользователей в репозитории исходного кода GitHub. [36]

История [ править ]

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

Haskell 1.0 - 1.4 [ править ]

Классы типов , которые позволяют осуществлять безопасную перегрузку операторов , были впервые предложены Филипом Вадлером и Стивеном Блоттом для Standard ML, но впервые были реализованы в Haskell между 1987 и версией 1.0. [38] [39]

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

Типовые классы возникли в Haskell

Haskell 98 [ править ]

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

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

Haskell 2010 [ править ]

В начале 2006 года начался процесс определения преемника стандарта Haskell 98, неофициально названного Haskell Prime . [41] Предполагалось, что это будет непрерывный поэтапный процесс для пересмотра определения языка, производящий новый пересмотр до одного раза в год. Первая ревизия, названная 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-notation и if-then-else было изменено для устранения неожиданных синтаксических ошибок.
  • LANGUAGE Прагма была указана. К 2010 году десятки расширений языка широко использовались, и GHC (среди других компиляторов) предоставил LANGUAGEпрагму для определения отдельных расширений со списком идентификаторов. Компиляторы Haskell 2010 должны поддерживать Haskell2010расширение, и рекомендуется поддерживать несколько других, которые соответствуют расширениям, добавленным в Haskell 2010.

Особенности [ править ]

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

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

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

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

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

Примеры кода [ править ]

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

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

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

- Аннотация типа (необязательно, одинаковая для каждой реализации) factorial  ::  ( Integral  a )  =>  a  ->  a- Использование рекурсии (с выражением ifthenelse) факториал  n  =  если  n  <  2,  то  1  иначе  n  *  факториал  ( n  -  1 )- Использование рекурсии (с сопоставлением с образцом) факториал  0  =  1 факториал  n  =  n  *  факториал  ( n  -  1 )- Использование рекурсии (с охранниками) факториала  n  |  n  <  2  =  1  |  в противном случае  =  n  *  факториал  ( n  -  1 )- Использование списка и факториала  функции "product" n  =  product  [ 1 .. n ]- Использование fold (реализует "product") факториал  n  =  foldl  ( * )  1  [ 1 .. n ]- Бесточечный стиль 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 ]  - отсортировать левую часть списка  ++  [ x ]  ++  - вставить  точку  поворота между двумя отсортированными частями quickSort [ a  |  a  <-  xs ,  a  > =  x ]  - отсортировать правую часть списка- Использование фильтра quickSort  []  =  [] quickSort  ( x : xs )  =  quickSort  ( filter  ( < x )  xs )  ++  [ x ]  ++  quickSort  ( filter  ( > = x )  xs )

Реализации [ править ]

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

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

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

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

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

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

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

Известные приложения [ править ]

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

Промышленность [ править ]

  • Bluespec SystemVerilog (BSV) - это язык для проектирования полупроводников, который является расширением Haskell. Кроме того, инструменты Bluespec, Inc. реализованы на Haskell.
  • Cryptol , язык и набор инструментов для разработки и проверки алгоритмов криптографии , реализован в Haskell.
  • Facebook реализует свои антиспамовые программы [55] на Haskell, поддерживая базовую библиотеку доступа к данным как программное обеспечение с открытым исходным кодом . [56]
  • GitHub реализовал в Haskell Semantic , библиотеку с открытым исходным кодом для анализа, сравнения и интерпретации ненадежного исходного кода. [57]
  • ВЫБ4 , первый официально подтверждено микроядра , [58] используется Haskell как язык прототипирования для разработчика ОС. [58] : p.2 В то же время, код Haskell определил исполняемую спецификацию, с помощью которой можно рассуждать, для автоматического перевода с помощью инструмента доказательства теорем. [58] : p.3 Таким образом, код Haskell служил промежуточным прототипом перед окончательной доработкой C. [58] : стр.3

Интернет [ править ]

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

  • Щелчок
  • Йесод

Критика [ править ]

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

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

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

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

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

Связанные языки [ править ]

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

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

  • Agda , функциональный язык с зависимыми типами .
  • Cayenne , с зависимыми типами .
  • Elm , функциональный язык для создания интерфейсных веб-приложений, без поддержки высокоуровневых типов.
  • Эпиграмма , функциональный язык с зависимыми типами, пригодный для доказательства свойств программ.
  • Idris - функциональный язык общего назначения с зависимыми типами , разработанный в Университете Сент-Эндрюс .
  • PureScript компилируется в JavaScript.
  • Ωmega , строгий и многое другое.

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

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

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

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

Конференции и семинары [ править ]

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

  • Международная конференция по функциональному программированию (ICFP)
  • Симпозиум Haskell (ранее - Мастерская Haskell)
  • Семинар разработчиков Haskell
  • Коммерческие пользователи функционального программирования (CUFP)

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

Ссылки [ править ]

  1. ^ a b c Худак и др. 2007 .
  2. ^ a b Марлоу, Саймон (24 ноября 2009 г.). «Анонс Haskell 2010» . Haskell (список рассылки) . Проверено 12 марта 2011 года .
  3. ^ a b Ридель, Герберт (28 апреля 2016 г.). «ИНН: сформирован комитет по Haskell Prime 2020» . Haskell-prime (список рассылки) . Дата обращения 6 мая 2017 .
  4. ^ Б с д е е г ч я J к л м Пейтон Джонс 2003 , стр. xi
  5. ^ Норелл, Ульф (2008). «Зависимо типизированное программирование в Agda» (PDF) . Гётеборг: Университет Чалмерса . Проверено 9 февраля 2012 года .
  6. ^ Худак и др. 2007 , с. 12–38, 43.
  7. ^ Страуструп, Бьярн ; Саттон, Эндрю (2011). «Дизайн концептуальных библиотек для C ++» (PDF) . Архивировано из оригинального (PDF) 10 февраля 2012 года. Цитировать журнал требует |journal=( помощь )
  8. ^ Б с д е е г ч я J Гудак и др. 2007 , стр. 12-45–46.
  9. ^ a b Мейер, Эрик (2006). «Признания продавца используемых языков программирования: привлечение масс к Haskell». Упсла 2007 . CiteSeerX 10.1.1.72.868 . 
  10. ^ Мейера, Erik (1 октября 2009). «Лекции C9: Доктор Эрик Мейер - Основы функционального программирования, Глава 1 из 13» . Канал 9 . Microsoft . Проверено 9 февраля 2012 года .
  11. ^ Drobi, Садек (4 марта 2009). «Эрик Мейер в LINQ» . InfoQ . QCon SF 2008: C4Media Inc . Проверено 9 февраля 2012 года .CS1 maint: location ( ссылка )
  12. ^ Хикки, Рич. "Книжная полка Clojure" . Listmania! . Архивировано из оригинала 3 октября 2017 года . Проверено 3 октября 2017 года .
  13. ^ Хеллер, Мартин (18 октября 2011 г.). «Поднимите нос на Дарта и понюхайте CoffeeScript» . InfoWorld . Проверено 15 июля 2020 .
  14. ^ "Декларативное программирование в Эшере" (PDF) . Проверено 7 октября 2015 года .
  15. ^ Сайм, Дон ; Гранич, Адам; Чистернино, Антонио (2007). Эксперт F # . Апресс . п. 2. F # также опирается на Haskell, особенно в отношении двух расширенных языковых функций, называемых последовательными выражениями и рабочими процессами .
  16. ^ Wechsung, Инго. "Язык программирования Фреге" (PDF) . Проверено 26 февраля 2014 года .
  17. ^ «Facebook представляет 'Hack', язык программирования будущего» . ПРОВОДНОЙ . 20 марта 2014 г.
  18. ^ «Идрис, язык с зависимой типизацией» . Проверено 26 октября 2014 года .
  19. ^ «LiveScript Вдохновение» . Проверено 4 февраля 2014 года .
  20. ^ Фриман, Фил (2016). «PureScript на примере» . Leanpub . Проверено 23 апреля 2017 года .
  21. ^ Kuchling, AM "Функциональное программирование HOWTO" . Документация по Python v2.7.2 . Фонд программного обеспечения Python . Проверено 9 февраля 2012 года .
  22. ^ «Глоссарий терминов и жаргонизмов» . Фонд Perl Perl 6 Wiki . Фонд Perl . Архивировано из оригинального 21 января 2012 года . Проверено 9 февраля 2012 года .
  23. ^ "Ссылка на Rust: Приложение: Влияния" . Дата обращения 3 февраля 2016 .
  24. ^ Fogus, Майкл (6 августа 2010). «МартинОдерский возьми (5) в список» . Отправьте больше медработников . Проверено 9 февраля 2012 года .
  25. ^ Латтнер, Крис (3 июня 2014 г.). "Домашняя страница Криса Латтнера" . Крис Латтнер . Дата обращения 3 июня 2014 . Язык Swift является продуктом неустанных усилий команды языковых экспертов, гуру документации, ниндзя по оптимизации компиляторов и невероятно важной внутренней группы, которая предоставила отзывы, чтобы помочь усовершенствовать и протестировать идеи. Конечно, он также очень выиграл от опыта, с трудом завоеванного многими другими языками в этой области, черпая идеи из Objective-C, Rust, Haskell, Ruby, Python, C #, CLU и слишком многих других, чтобы перечислить.
  26. ^ "Древесина / История" . Проверено 7 октября 2015 года .
  27. Шевалье, Тим (28 января 2008 г.). "кто-нибудь может сказать мне произношение" haskell "?" . Haskell-cafe (Список рассылки) . Проверено 12 марта 2011 года .
  28. ^ Вывод типа первоначально с использованием вывода типа Хиндли-Милнера
  29. ^ a b c Пейтон Джонс 2003 .
  30. ^ Эдвард Кметт, Эдвард Кметт - Типовые классы против мира
  31. ^ «Haskell в образовании» . Проверено 15 февраля +2016 .
  32. ^ «Haskell в исследованиях» . Проверено 15 февраля +2016 .
  33. ^ Моссберг, Erik (8 июня 2020), erkmos / Haskell-компании , получены 22 июня 2020
  34. ^ "Haskell в промышленности - HaskellWiki" . wiki.haskell.org . Проверено 22 июня 2020 .
  35. ^ "Индекс популярности языка программирования PYPL" . pypl.github.io . 22 января 2021. Архивировано из оригинала 17 сентября 2020 года . Проверено 22 января 2021 года .
  36. ^ Фредериксон, Бен. «Рейтинг языков программирования пользователями GitHub» . www.benfrederickson.com . Дата обращения 6 сентября 2019 .
  37. ^ a b c Пейтон Джонс 2003 , Предисловие.
  38. ^ «Классы типов, впервые предложенные при разработке языка программирования Haskell, ...» - Джон Гаррет Моррис (2013), «Классы типов и цепочки экземпляров: реляционный подход»
  39. ^ Wadler, Филипп (октябрь 1988). «Как сделать специальный полиморфизм менее случайным» .
  40. ^ "Haskell Wiki: Реализации" . Проверено 18 декабря 2012 года .
  41. ^ "Добро пожаловать на Haskell ' " . Вики-сайт Haskell .
  42. ^ Wadler, P .; Блотт, С. (1989). «Как сделать специальный полиморфизм менее случайным». Материалы 16-го Симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования . ACM : 60–76. DOI : 10.1145 / 75277.75283 . ISBN 978-0-89791-294-5. S2CID  15327197 .
  43. ^ Холлгрен, T. (январь 2001). «Развлечение с функциональными зависимостями или типами как значениями в статических вычислениях в Haskell» . Труды совместной зимней встречи CS / CE . Варберг, Швеция.
  44. ^ Игра "Тесты компьютерного языка"
  45. ^ "Статистика HackageDB" . Hackage.haskell.org. Архивировано из оригинала 3 мая 2013 года . Проверено 26 июня 2013 года .
  46. ^ "Реализации" в Haskell Wiki
  47. ^ "Бэкэнд LLVM" . GHC Trac .
  48. ^ Терей, Дэвид А .; Чакраварти, Мануэль MT (2010). «Бэкэнд LLVM для GHC» . Материалы симпозиума ACM SIGPLAN Haskell 2010 . ACM Press.
  49. ^ С. Райдер и С. Томпсон (2005). «Перенос HaRe на GHC API»
  50. ^ Утрехтский компилятор Haskell
  51. ^ Худак и др. 2007 , стр. 12–22.
  52. ^ "The Haskell Cabal" . Проверено 8 апреля 2015 года .
  53. ^ "Linspire / Freespire Core OS Team и Haskell" . Список рассылки Debian Haskell . Май 2006 г.
  54. ^ xmonad.org
  55. ^ «Борьба со спамом с помощью Haskell» . Код Facebook . 26 июня 2015 . Дата обращения 11 августа 2019 .
  56. ^ "Открытый исходный код Haxl, библиотеки для Haskell" . Код Facebook . 10 июня 2014 . Дата обращения 11 августа 2019 .
  57. ^ Разбор, анализ и сравнение исходного кода на многих языках: github / semantic , GitHub, 7 июня 2019 г. , получено 7 июня 2019 г.
  58. ^ a b c d Формальное доказательство функциональной корректности было завершено в 2009 году. Klein, Gerwin; Эльфинстон, Кевин; Хайзер, Гернот ; Андроник, июнь; Петух, Дэвид; Деррин, Филип; Элькадуве, Дхаммика; Энгельгардт, Кай; Колански, Рафаль; Норриш, Майкл; Сьюэлл, Томас; Туч, Харви; Уинвуд, Саймон (октябрь 2009 г.). «seL4: Формальная проверка ядра ОС» (PDF) . 22-й симпозиум ACM по принципам операционных систем . Big Sky, MT, США.
  59. ^ "Веб / Frameworks - HaskellWiki" . wiki.haskell.org . Дата обращения 11 августа 2019 .
  60. ^ Ян-Виллем Мессен. Стремительный Haskell: выполнение с ограниченными ресурсами дает эффективную итерацию . Трудысеминара SIGPLAN Ассоциации вычислительной техники (ACM)2002 годапо Haskell.
  61. ^ Саймон Пейтон Джонс. В волосяной рубашке: ретроспектива на Haskell . Приглашенный доклад на POPL 2003.
  62. ^ «Ленивая оценка может привести к отличной производительности, например, в игре The Computer Language Benchmarks Game» .
  63. ^ Heeren, Bastiaan; Лейен, Даан; ван Эйзендорн, Арьян (2003). «Гелий для изучения Haskell» (PDF) . Труды семинара ACM SIGPLAN 2003 по Haskell : 62–71. DOI : 10.1145 / 871895.871902 . ISBN  1581137583. S2CID  11986908 .
  64. ^ "DDC - HaskellWiki" . Haskell.org. 3 декабря 2010 . Проверено 26 июня 2013 года .
  65. ^ Бен Липпмайер, Вывод типов и оптимизация для нечистого мира , Австралийский национальный университет (2010), докторская диссертация, глава 1
  66. ^ Роберт Харпер. «Дело лени» .
  67. ^ Роберт Харпер. «Модули имеют наибольшее значение» .
  68. ^ «Решение ада Кабала» . www.yesodweb.com . Дата обращения 11 августа 2019 .
  69. ^ «Объявление о новой сборке Кабала: локальные сборки в стиле Nix» . Дата обращения 1 октября 2019 .
  70. ^ "Хакатон - HaskellWiki" .

Дальнейшее чтение [ править ]

Отчеты
  • Пейтон Джонс, Саймон , изд. (2003). Haskell 98 Language and Libraries: The Revised Report . Издательство Кембриджского университета. ISBN 978-0521826143.
  • Марлоу, Саймон , изд. (2010). Отчет о языке Haskell 2010 (PDF) . Haskell.org.
Учебники
  • Дэви, Энтони (1992). Введение в системы функционального программирования с использованием Haskell . Издательство Кембриджского университета. ISBN 978-0-521-25830-2.
  • Птица, Ричард (1998). Введение в функциональное программирование с использованием Haskell (2-е изд.). Prentice Hall Press. ISBN 978-0-13-484346-9.
  • Худак, Пол (2000). Школа выражения Haskell: изучение функционального программирования с помощью мультимедиа . Нью-Йорк: Издательство Кембриджского университета. ISBN 978-0521643382.
  • Хаттон, Грэм (2007). Программирование на Haskell . Издательство Кембриджского университета. ISBN 978-0521692694.
  • О'Салливан, Брайан ; Стюарт, Дон ; Герцен, Джон (2008). Реальный мир Haskell . Севастополь: О'Рейли. ISBN 978-0-596-51498-3 ( полный текст )
  • Томпсон, Саймон (2011). Haskell: The Craft of Functional Programming (3-е изд.). Эддисон-Уэсли. ISBN 978-0201882957.
  • Липовача, Миран (апрель 2011 г.). Выучите Haskell на благо! . Сан-Франциско: Пресса без крахмала. ISBN 978-1-59327-283-8.( полный текст )
  • Птица, Ричард (2014). Функциональное мышление с помощью Haskell . Издательство Кембриджского университета. ISBN 978-1-107-45264-0.
Учебники
  • Худак, Пол; Петерсон, Джон; Фазель, Джозеф (июнь 2000 г.). «Нежное введение в Haskell, версия 98» . Haskell.org .
  • Еще один учебник по Haskell , автор Hal Daumé III; предполагает гораздо меньше предварительных знаний, чем официальное руководство
  • Йоргей, Брент (12 марта 2009 г.). "Типеклассопедия" (PDF) . The Monad.Reader (13): 17–68.
  • Магуайр, Сэнди (2018). Мышление с помощью типов: программирование на уровне типов в Haskell .
История
  • Худак, Пол ; Хьюз, Джон ; Пейтон Джонс, Саймон ; Уодлер, Филип (2007). «История Haskell: лень с классом» (PDF) . Материалы третьей конференции ACM SIGPLAN по истории языков программирования (HOPL III) : 12–1–55. DOI : 10.1145 / 1238844.1238856 . ISBN 978-1-59593-766-7. S2CID  52847907 .
  • Гамильтон, Наоми (19 сентября 2008 г.). «Азия языков программирования: Haskell» . Компьютерный мир .

Внешние ссылки [ править ]

  • Официальный веб-сайт
  • Официальная вики