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, взаимодействие с пользователем и ввод-вывод (ввод и вывод) обрабатывались как механизмами, основанными на потоках, так и механизмами продолжения, которые многие считали неудовлетворительными. [36] В версии 1.3 был введен монадический ввод-вывод, а также обобщение классов типов на более высокие виды (конструкторы типов). Наряду с «нотацией do», которая обеспечивает синтаксический сахар для класса типов Monad, это дало Haskell систему эффектов, которая поддерживала ссылочную прозрачность и была удобна.

Другими заметными изменениями в ранних версиях были подход к функции seq, которая создает зависимость данных между значениями и используется в ленивых языках, чтобы избежать чрезмерного потребления памяти; при этом он переходит от класса типа к стандартной функции, чтобы сделать рефакторинг более практичным.

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

Иерархия классов типов в прелюдии Haskell начиная с GHC 7.10. Включение Foldable и Traversable (с соответствующими изменениями в сигнатурах типов некоторых функций) и Applicative в качестве промежуточного между Functor и Monad является отклонением от стандарта Haskell 2010.

Хаскель 98

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

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

Хаскелл 2010

В начале 2006 года начался процесс определения преемника стандарта Haskell 98, неофициально названного Haskell Prime . [38] Предполагалось, что это будет непрерывный постепенный процесс пересмотра определения языка, который будет производиться до одного раза в год. Первая версия, названная Haskell 2010 , была анонсирована в ноябре 2009 года [2] и опубликована в июле 2010 года.

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

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

Следующая официальная спецификация была запланирована на 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]

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

Примеры кода

« Привет , мир!» программа на Haskell (строго обязательна только последняя строка):

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

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

факториал :: ( Интеграл a ) => a -> a       -- Использование рекурсии (с выражением "ifthenelse") факториал n = если n < 2 , то 1 else n * факториал ( n - 1 )               -- Использование рекурсии (с сопоставлением с образцом) факториал 0 = 1 факториал n = n * факториал ( n - 1 )           -- Использование рекурсии (с защитой) Factorial n | п < 2 знак равно 1 | иначе = n * факториал ( n - 1 )                -- Использование списка и функции "произведение" факториал n = произведение [ 1 .. n ]    -- Использование сгиба (реализует "произведение") факториала n = foldl ( * ) 1 [ 1 .. n ]      -- Факториал стиля без точек = foldr ( * ) 1 . перечислениеFromTo 1       

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

импортировать Data.Function ( исправить )  факториал = fix fac где fac f x | х < 2 = 1 | иначе = x * f ( x - 1 )                       


Поскольку тип Integer имеет произвольную точность , этот код будет вычислять такие значения, как factorial 100000(число из 456 574 цифр), без потери точности.

Реализация алгоритма, аналогичного быстрой сортировке списков, где в качестве опорного принимается первый элемент:

-- Введите аннотацию (необязательно, одинаковую для каждой реализации) QuickSort :: Ord a => [ a ] ​​-> [ a ]       -- Использование генераторов списков QuickSort [] = [] -- Пустой список уже отсортирован QuickSort ( x : xs ) = QuickSort [ a | a <- xs , a < x ] — Сортировка левой части списка ++ [ x ] ++ — Вставка опорной точки между двумя отсортированными частями QuickSort [ a | a <- xs , a >= x ] — Сортировка правой части списка                              -- Использование фильтра быстрой сортировки [] = [] быстрой сортировки ( x : xs ) = быстрой сортировки ( фильтра ( < x ) xs ) ++ [ x ] ++ быстрой сортировки ( фильтра ( >= x ) xs )                

Реализации

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

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

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

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

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

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

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

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

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

Рекомендации

  1. ^ abc Худак и др. 2007.
  2. ^ Аб Марлоу, Саймон (24 ноября 2009 г.). «Анонс Haskell 2010». Haskell (список рассылки) . Проверено 12 марта 2011 г.
  3. ^ аб Ридель, Герберт (28 апреля 2016 г.). «ANN: Сформирован комитет Haskell Prime 2020» . Haskell-prime (список рассылки) . Проверено 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 Hudak et al. 2007, стр. 12–45–46.
  9. ^ Аб Мейер, Эрик (2006). «Исповедь продавца подержанных языков программирования: как привлечь массы к Haskell». Упсла 2007 . CiteSeerX 10.1.1.72.868 . 
  10. Мейер, Эрик (1 октября 2009 г.). «Лекции C9: доктор Эрик Мейер - Основы функционального программирования, глава 1 из 13». Канал 9 . Майкрософт . Проверено 9 февраля 2012 года .
  11. Дроби, Садек (4 марта 2009 г.). «Эрик Мейер о LINQ». ИнфоQ . QCon SF 2008: C4Media Inc. Проверено 9 февраля 2012 года .{{cite news}}: CS1 maint: местоположение ( ссылка )
  12. ^ Хикки, Рич. «Книжная полка Clojure». Листмания! . Архивировано из оригинала 3 октября 2017 года . Проверено 3 октября 2017 г.
  13. Хеллер, Мартин (18 октября 2011 г.). «Задирайте нос от Dart и почувствуйте запах CoffeeScript». Инфомир . Проверено 15 июля 2020 г.
  14. ^ «Декларативное программирование в Эшере» (PDF) . Проверено 7 октября 2015 г.
  15. ^ Сайм, Дон ; Гранич, Адам; Чистернино, Антонио (2007). Эксперт F# . Апресс . п. 2. F# также опирается на Haskell, в частности, в отношении двух продвинутых функций языка, называемых выражениями последовательности и рабочими процессами .
  16. ^ «Facebook представляет «Hack», язык программирования будущего» . ПРОВОДНОЙ . 20 марта 2014 г.
  17. ^ «Идрис, зависимо типизированный язык» . Проверено 26 октября 2014 г.
  18. ^ «Вдохновение LiveScript» . Проверено 4 февраля 2014 г.
  19. ^ Фриман, Фил (2016). «PureScript на примере». Линпаб . Проверено 23 апреля 2017 г.
  20. ^ Кучлинг, AM «HOWTO по функциональному программированию». Документация Python v2.7.2 . Фонд программного обеспечения Python . Проверено 9 февраля 2012 года .
  21. ^ «Словарь терминов и жаргона». Perl Foundation Perl 6 Wiki . Фонд Перла . Архивировано из оригинала 21 января 2012 года . Проверено 9 февраля 2012 года .
  22. ^ «Влияния - Ссылка на ржавчину» . Справочник по ржавчине . Проверено 31 декабря 2023 г.
  23. Фогус, Майкл (6 августа 2010 г.). «Мартин Одерский возьми(5) в список». Отправьте больше парамедиков . Проверено 9 февраля 2012 года .
  24. Латтнер, Крис (3 июня 2014 г.). «Домашняя страница Криса Лэттнера». Крис Лэттнер . Проверено 3 июня 2014 г. Язык Swift — это продукт неустанных усилий команды языковых экспертов, гуру документации, ниндзя по оптимизации компиляторов и невероятно важной внутренней экспериментальной группы, которая предоставляла отзывы, помогающие совершенствовать и проверять идеи. Конечно, он также получил большую пользу от опыта, с трудом полученного многими другими языками в этой области, черпая идеи из Objective-C, Rust, Haskell, Ruby, Python, C#, CLU и многих других, чтобы их перечислять.
  25. Шевалье, Тим (28 января 2008 г.). «Кто-нибудь может сказать мне, как произносится слово «хаскелл»?». Haskell-кафе (Список рассылки) . Проверено 12 марта 2011 г.
  26. ^ Вывод типа, первоначально использовавший вывод типа Хиндли-Милнера.
  27. ^ abc Пейтон Джонс 2003.
  28. ^ Эдвард Кметт, Эдвард Кметт - Типовые классы против мира
  29. Моссберг, Эрик (8 июня 2020 г.), erkmos/haskell-companies , получено 22 июня 2020 г.
  30. ^ О'Салливан, Брайан; Герцен, Джон; Стюарт, Дональд Брюс (15 ноября 2008 г.). Реальный мир Haskell: код, в который можно поверить. «О'Рейли Медиа, Инк.». стр. xxviii – xxxi. ISBN 978-0-596-55430-9.
  31. ^ «Haskell в производстве: Книга рисков» . Компания по разработке программного обеспечения Serokell . Проверено 7 сентября 2021 г.
  32. ^ «Индекс популярности языка программирования PYPL» . pypl.github.io . Май 2021 г. Архивировано из оригинала 7 мая 2021 г. Проверено 16 мая 2021 г.
  33. ^ Фредериксон, Бен. «Рейтинг языков программирования по пользователям GitHub». www.benfrederickson.com . Проверено 6 сентября 2019 г.
  34. ^ abc Пейтон Джонс 2003, Предисловие.
  35. ^ Уодлер, Филип (октябрь 1988 г.). «Как сделать специальный полиморфизм менее специальным».
  36. ^ Пейтон Джонс, Саймон (2003). «Власяница: ретроспектива Haskell». Майкрософт .
  37. ^ "Haskell Wiki: Реализации" . Проверено 18 декабря 2012 г.
  38. ^ «Добро пожаловать в Haskell» . Haskell Wiki . Архивировано из оригинала 20 февраля 2016 года . Проверено 11 февраля 2016 г. .
  39. ^ Команда GHC 2020 (29 октября 2021 г.) Выпущен GHC 9.2.1
  40. ^ Предлагаемые изменения компилятора и языка для GHC и GHC/Haskell.
  41. ^ Вадлер, П.; Блотт, С. (1989). «Как сделать специальный полиморфизм менее специальным». Материалы 16-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования - POPL '89 . АКМ . стр. 60–76. дои : 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" . ГХК Трак . 29 марта 2019 г.
  47. ^ Терей, Дэвид А.; Чакраварти, Мануэль М.Т. (2010). «Бэкэнд LLVM для GHC». Материалы симпозиума ACM SIGPLAN Haskell 2010 . АКМ Пресс.
  48. ^ К. Райдер и С. Томпсон (2005). «Портирование HaRe на GHC API»
  49. ^ Утрехтский компилятор Haskell
  50. ^ Худак и др. 2007, стр. 12–22.
  51. Agda 2, Сообщество Agda Github, 15 октября 2021 г. , получено 16 октября 2021 г.
  52. ^ "Заговор Хаскелла" . Проверено 8 апреля 2015 г.
  53. ^ «Команда Linspire/Freespire Core OS и Haskell» . Список рассылки Debian Haskell . Май 2006.
  54. ^ «Живой код с приливными циклами | Приливные циклы» . doc.tidalcycles.org . Проверено 19 января 2022 г.
  55. ^ xmonad.org
  56. ^ "Гаргантекст / Главное". 13 июля 2023 г.
  57. ^ Дэвид, Чавалариас; и другие. (8 мая 2023 г.). К программе исследований цифровых медиа и благополучия человечества (отчет).
  58. ^ «Борьба со спамом с помощью Haskell». Код Фейсбука . 26 июня 2015 г. Проверено 11 августа 2019 г.
  59. ^ «Haxl с открытым исходным кодом, библиотека для Haskell» . Код Фейсбука . 10 июня 2014 года . Проверено 11 августа 2019 г.
  60. ^ «input-output-hk/cardano-node: основной компонент, который используется для участия в децентрализованной цепочке блоков Cardano». Гитхаб . Проверено 18 марта 2022 г.
  61. ^ Анализ, анализ и сравнение исходного кода на многих языках: github/semantic, GitHub, 7 июня 2019 г. , получено 7 июня 2019 г.
  62. ^ «Отчет о семинаре для коммерческих пользователей функционального программирования» (PDF) . Проверено 10 июня 2022 г.
  63. ^ abcd Формальное доказательство функциональной корректности было завершено в 2009 году. Кляйн, Гервин; Эльфинстон, Кевин; Хайзер, Гернот ; Андроник, июнь; Кок, Дэвид; Деррин, Филип; Элькадуве, Дхаммика; Энгельхардт, Кай; Колански, Рафаль; Норриш, Майкл; Сьюэлл, Томас; Тач, Харви; Уинвуд, Саймон (октябрь 2009 г.). «seL4: формальная проверка ядра ОС» (PDF) . 22-й симпозиум ACM по принципам работы операционных систем . Биг Скай, Монтана, США.
  64. ^ «Тихон Джелвис: Хаскелл у цели». YouTube .
  65. ^ «Почему созвездие использует Haskell» . Созвездие . Проверено 30 сентября 2023 г.
  66. ^ "Веб/Фреймворки - HaskellWiki" . wiki.haskell.org . Проверено 17 сентября 2022 г.
  67. ^ Ян-Виллем Мессен. Eager Haskell: выполнение с ограничением ресурсов обеспечивает эффективную итерацию . Материалы семинара SIGPLAN Ассоциации вычислительной техники (ACM) 2002 года по Haskell.
  68. ^ [ неработающая ссылка ] Саймон Пейтон Джонс. Ношение власяницы: ретроспектива Haskell. Приглашенный доклад на POPL 2003.
  69. ^ «Ленивая оценка может привести к отличной производительности, как, например, в игре «Компьютерные тесты языка»» . 27 июня 2006 г.
  70. ^ Хирен, Бастиан; Лейен, Даан; ван Эйзендорн, Арьян (2003). «Гелий для изучения Haskell» (PDF) . Материалы семинара ACM SIGPLAN 2003 года по Haskell . стр. 62–71. дои : 10.1145/871895.871902. ISBN 1581137583. S2CID  11986908.
  71. ^ "Документация компилятора гелия" . Гитхаб . Проверено 9 июня 2023 г.
  72. ^ "DDC - HaskellWiki" . Хаскелл.орг. 3 декабря 2010 года . Проверено 26 июня 2013 г.
  73. ^ Бен Липпмайер, Вывод типов и оптимизация для нечистого мира, Австралийский национальный университет (2010), докторская диссертация, глава 1
  74. Роберт Харпер (25 апреля 2011 г.). «Точка лени». Значок закрытого доступа
  75. ^ Роберт Харпер (16 апреля 2011 г.). «Модули важнее всего». Значок закрытого доступа
  76. ^ «Решение Кабал-Ада». www.yesodweb.com . Проверено 11 августа 2019 г.
  77. ^ «Анонсируем новую сборку клики: локальные сборки в стиле Nix» . Проверено 1 октября 2019 г.
  78. ^ https://zfoh.ch/
  79. ^ "Хакатон - HaskellWiki" .

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

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

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