stringtranslate.com

Хаскелл

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 года Haskell был 28-м по популярности языком программирования по результатам поиска учебных пособий в Google , [32] и составлял менее 1% активных пользователей в репозитории исходного кода GitHub . [33]

История

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

Хаскелл 1.0 — 1.4

Haskell был разработан комитетом, пытавшимся объединить готовые решения там, где это было возможно.

Классы типов , которые обеспечивают безопасную перегрузку операторов , были впервые предложены Филиппом Уодлером и Стивеном Блоттом для решения специальной обработки типов равенства и арифметической перегрузки в языках того времени. [35]

В ранних версиях 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).

Иерархия классов типов в прелюдии 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 — это постепенное обновление языка, в основном включающее несколько широко используемых и бесспорных функций, ранее включенных с помощью флагов, специфичных для компилятора.

Будущие стандарты

Следующая формальная спецификация была запланирована на 2020 год. [3] 29 октября 2021 года с версией GHC 9.2.1 было выпущено расширение GHC2021. Хотя это не формальная языковая спецификация, она объединяет несколько стабильных, широко используемых расширений GHC для Haskell 2010. [39] [40]

Функции

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

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

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

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

Вокруг языка существует активное, растущее сообщество, и более 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       

Использование комбинатора с фиксированной точкой в ​​Haskell позволяет записать эту функцию без какой-либо явной рекурсии.

импортировать 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 )                

Реализации

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

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

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

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

Известные приложения

Промышленность

Веб

Известные веб-фреймворки , написанные для 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 , исторически критиковался за плохую обработку нескольких версий одной и той же библиотеки, проблема, известная как «Cabal hell». Сервер Stackage и инструмент сборки Stack были созданы в ответ на эту критику. [76] Сам Cabal теперь имеет гораздо более сложную систему сборки, в значительной степени вдохновленную Nix , [77] которая стала системой по умолчанию с версии 3.0.

Родственные языки

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

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

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

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

Конференции и семинары

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

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

Ссылки

  1. ^ abc Худак и др. 2007.
  2. ^ ab Marlow, Simon (24 ноября 2009 г.). "Announcing Haskell 2010". Haskell (Mailing list) . Получено 12 марта 2011 г.
  3. ^ ab Riedel, Herbert (28 апреля 2016 г.). "ANN: Haskell Prime 2020 Committee has generated". Haskell-prime (Mailing list) . Получено 6 мая 2017 г.
  4. ^ abcdefghijklm Пейтон Джонс 2003, стр. xi
  5. ^ Норелл, Ульф (2008). "Программирование с зависимой типизацией в Agda" (PDF) . Гетеборг: Университет Чалмерса . Получено 9 февраля 2012 г.
  6. ^ Худак и др. 2007, стр. 12–38, 43.
  7. ^ Страуструп, Бьярне ; Саттон, Эндрю (2011). "Проектирование концептуальных библиотек для C++" (PDF) . Программная языковая инженерия . Архивировано из оригинала (PDF) 10 февраля 2012 г.
  8. ^ abcdefghij Худак и др. 2007, стр. 12-45–46.
  9. ^ ab Meijer, Erik (2006). «Исповедь продавца подержанных языков программирования: как подсадить массы на Haskell». Oopsla 2007. CiteSeerX 10.1.1.72.868 . 
  10. ^ Мейер, Эрик (1 октября 2009 г.). «Лекции C9: д-р Эрик Мейер – Основы функционального программирования, глава 1 из 13». Channel 9 . Microsoft. Архивировано из оригинала 16 июня 2012 г. . Получено 9 февраля 2012 г. .
  11. ^ Дроби, Садек (4 марта 2009 г.). «Эрик Мейер о LINQ». InfoQ . QCon SF 2008: C4Media Inc . Получено 9 февраля 2012 г. .{{cite news}}: CS1 maint: местоположение ( ссылка )
  12. ^ Хики, Рич. "Clojure Bookshelf". Listmania! . Архивировано из оригинала 3 октября 2017 г. . Получено 3 октября 2017 г. .
  13. ^ Хеллер, Мартин (18 октября 2011 г.). «Отверните нос от Dart и почувствуйте запах CoffeeScript». InfoWorld . Получено 15 июля 2020 г.
  14. ^ "Декларативное программирование в Escher" (PDF) . Получено 7 октября 2015 г.
  15. ^ Syme, Don ; Granicz, Adam; Cisternino, Antonio (2007). Expert F# . Apress . стр. 2. F# также черпает вдохновение из Haskell, особенно в отношении двух расширенных языковых функций, называемых выражениями последовательностей и рабочими процессами .
  16. ^ «Facebook представляет «Hack» — язык программирования будущего». WIRED . 20 марта 2014 г.
  17. ^ "Идрис, язык с зависимой типизацией" . Получено 26 октября 2014 г.
  18. ^ "LiveScript Inspiration" . Получено 4 февраля 2014 г. .
  19. ^ Freeman, Phil (2016). "PureScript by Example". Leanpub . Получено 23 апреля 2017 г.
  20. ^ Кухлинг, AM "Functional Programming HOWTO". Документация Python v2.7.2 . Python Software Foundation . Получено 9 февраля 2012 г.
  21. ^ "Глоссарий терминов и жаргон". Perl Foundation Perl 6 Wiki . Perl Foundation . Архивировано из оригинала 21 января 2012 года . Получено 9 февраля 2012 года .
  22. ^ "Влияния - The Rust Reference". The Rust Reference . Получено 31 декабря 2023 г. .
  23. ^ Фогус, Майкл (6 августа 2010 г.). "MartinOdersky take(5) toList". Отправить еще парамедиков . Получено 9 февраля 2012 г.
  24. ^ Lattner, Chris (3 июня 2014 г.). "Домашняя страница Криса Латтнера". Крис Латтнер . Получено 3 июня 2014 г. Язык Swift является продуктом неустанных усилий команды экспертов по языку, гуру документации, ниндзя оптимизации компиляторов и невероятно важной внутренней группы по догфудингу, которая предоставляла обратную связь, чтобы помочь отточить и проверить идеи в бою. Конечно, он также значительно выиграл от опыта, полученного с трудом многими другими языками в этой области, черпая идеи из Objective-C, Rust, Haskell, Ruby, Python, C#, CLU и слишком многих других, чтобы перечислить их.
  25. Шевалье, Тим (28 января 2008 г.). «кто-нибудь может сказать мне, как произносится «хаскелл»?». Haskell-cafe (список рассылки) . Получено 12 марта 2011 г.
  26. ^ Вывод типа изначально с использованием вывода типа Хиндли-Милнера
  27. ^ abc Пейтон Джонс 2003.
  28. ^ Эдвард Кметт, Эдвард Кметт – Классы типов против мира
  29. ^ Моссберг, Эрик (8 июня 2020 г.), erkmos/haskell-companies , получено 22 июня 2020 г.
  30. О'Салливан, Брайан; Герцен, Джон; Стюарт, Дональд Брюс (15 ноября 2008 г.). Реальный мир Haskell: код, в который можно верить. «O'Reilly Media, Inc.». С. xxviii–xxxi. ISBN 978-0-596-55430-9.
  31. ^ "Haskell in Production: Riskbook". Serokell Software Development Company . Получено 7 сентября 2021 г.
  32. ^ "PYPL PopularitY of Programming Language index". pypl.github.io . Май 2021. Архивировано из оригинала 7 мая 2021 . Получено 16 мая 2021 .
  33. ^ Фредериксон, Бен. «Рейтинг языков программирования по версии пользователей GitHub». www.benfrederickson.com . Получено 6 сентября 2019 г. .
  34. ^ abc Пейтон Джонс 2003, Предисловие.
  35. ^ Вадлер, Филип (октябрь 1988 г.). «Как сделать полиморфизм ad hoc менее ad hoc».
  36. ^ Пейтон Джонс, Саймон (2003). «Власяница: ретроспектива Haskell». Microsoft .
  37. ^ "Haskell Wiki: Реализации" . Получено 18 декабря 2012 г.
  38. ^ "Welcome to Haskell'". Haskell' Wiki . Архивировано из оригинала 20 февраля 2016 года . Получено 11 февраля 2016 года .
  39. Команда GHC 2020 (29 октября 2021 г.) Выпущен GHC 9.2.1
  40. ^ Предлагаемые изменения компилятора и языка для GHC и GHC/Haskell
  41. ^ Wadler, P.; Blott, S. (1989). "Как сделать ad-hoc полиморфизм менее ad hoc". Труды 16-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования - POPL '89 . ACM . С. 60–76. doi : 10.1145/75277.75283 . ISBN 978-0-89791-294-5. S2CID  15327197.
  42. ^ Халлгрен, Т. (январь 2001 г.). «Развлечения с функциональными зависимостями, или типы как значения в статических вычислениях в Haskell». Труды совместного зимнего совещания CS/CE . Варберг, Швеция.
  43. ^ Игра «Тесты компьютерного языка»
  44. ^ "Статистика HackageDB". Hackage.haskell.org. Архивировано из оригинала 3 мая 2013 года . Получено 26 июня 2013 года .
  45. ^ "Реализации" на Haskell Wiki
  46. ^ "LLVM Backend". GHC Trac . 29 марта 2019 г.
  47. ^ Terei, David A.; Chakravarty, Manuel MT (2010). "Бэкэнд LLVM для GHC". Труды симпозиума ACM SIGPLAN Haskell 2010. ACM Press.
  48. ^ C. Ryder и S. Thompson (2005). «Портирование HaRe в API GHC»
  49. ^ Утрехтский компилятор Haskell
  50. ^ Худак и др. 2007, стр. 12–22.
  51. Agda 2, Сообщество Agda Github, 15 октября 2021 г. , получено 16 октября 2021 г.
  52. ^ "The Haskell Cabal" . Получено 8 апреля 2015 г.
  53. ^ "Linspire/Freespire Core OS Team and Haskell". Список рассылки Debian Haskell . Май 2006. Архивировано из оригинала 27 декабря 2017. Получено 14 июня 2006 .
  54. ^ "Live code with Tidal Cycles". Tidal Cycles . Получено 19 января 2022 г. .
  55. ^ xmonad.org
  56. ^ "Gargantext – Main". 13 июля 2023 г.
  57. ^ Дэвид, Чавалариас и др. (8 мая 2023 г.). На пути к исследовательской повестке дня в области цифровых медиа и благополучия человечества (отчет).
  58. ^ «Борьба со спамом с помощью Haskell». Facebook Code . 26 июня 2015 г. Получено 11 августа 2019 г.
  59. ^ "Открытый исходный код Haxl, библиотеки для Haskell". Facebook Code . 10 июня 2014 г. Получено 11 августа 2019 г.
  60. ^ "input-output-hk/cardano-node: Основной компонент, который используется для участия в децентрализованном блокчейне Cardano". GitHub . Получено 18 марта 2022 г.
  61. ^ Разбор, анализ и сравнение исходного кода на многих языках: github/semantic, GitHub, 7 июня 2019 г. , получено 7 июня 2019 г.
  62. ^ "Отчет о семинаре коммерческих пользователей функционального программирования" (PDF) . Получено 10 июня 2022 г.
  63. ^ abcd Формальное доказательство функциональной корректности было завершено в 2009 году. Кляйн, Гервин; Элфинстоун, Кевин; Хейзер, Гернот ; Андроник, Джун; Кок, Дэвид; Деррин, Филипп; Элкадуве, Дхаммика; Энгельхардт, Кай; Колански, Рафал; Норриш, Майкл; Сьюэлл, Томас; Тач, Харви; Уинвуд, Саймон (октябрь 2009 г.). "seL4: Формальная проверка ядра ОС" (PDF) . 22-й симпозиум ACM по принципам операционных систем . Биг-Скай, Монтана, США.
  64. ^ "Тихон Джелвис: Haskell в Target". YouTube . 22 апреля 2017 г.
  65. ^ "Почему Co–Star использует Haskell". Co–Star . Получено 30 сентября 2023 г. .
  66. ^ "Web/Frameworks – HaskellWiki". wiki.haskell.org . Получено 17 сентября 2022 г. .
  67. ^ Ян-Виллем Мессен. Нетерпеливый Хаскелл: ограниченное ресурсами выполнение дает эффективную итерацию . Труды семинара SIGPLAN Ассоциации вычислительной техники (ACM) 2002 года по Хаскеллу.
  68. ^ [ мертвая ссылка ] Саймон Пейтон Джонс. Ношение власяницы: ретроспектива Haskell. Приглашенный доклад на POPL 2003.
  69. ^ «Ленивое вычисление может привести к отличной производительности, как в игре The Computer Language Benchmarks Game». 27 июня 2006 г.
  70. ^ Хирен, Бастиан; Лейен, Даан; ван Эйзендорн, Арьян (2003). «Гелий для изучения Haskell» (PDF) . Материалы семинара ACM SIGPLAN 2003 года по Haskell . стр. 62–71. дои : 10.1145/871895.871902. ISBN 1581137583. S2CID  11986908.
  71. ^ "Helium Compiler Docs". GitHub . Получено 9 июня 2023 г.
  72. ^ "DDC – HaskellWiki". Haskell.org. 3 декабря 2010 г. Получено 26 июня 2013 г.
  73. ^ Бен Липпмейер, Вывод типов и оптимизация для нечистого мира, Австралийский национальный университет (2010) докторская диссертация, глава 1
  74. Роберт Харпер (25 апреля 2011 г.). «Точка лени». Значок закрытого доступа
  75. Роберт Харпер (16 апреля 2011 г.). «Модули имеют наибольшее значение». Значок закрытого доступа
  76. ^ "Solving Cabal Hell". www.yesodweb.com . Получено 11 августа 2019 .
  77. ^ "Анонс новой сборки Cabal: локальные сборки в стиле Nix" . Получено 1 октября 2019 г.
  78. ^ https://zfoh.ch/ [ пустой URL ]
  79. ^ «Хакатон – HaskellWiki».

Библиография

Отчеты
Учебники
Учебники
История

Внешние ссылки