Haskell (укр. Гаскель, Гаскелл) — стандартизована, винятково функційна мова програмування з нестрогою семантикою. Названа на честь американського математика Гаскелла Каррі, роботи якого в галузі математичної логіки є базовими для функційного програмування. Гаскель базується на лямбда численні. Найважливішими реалізаціями є компілятор Glasgow Haskell Compiler (GHC) та оснований на ньому компілятор GHCJS, що компілює Гаскель-код у скрипт мовою JavaScript. Історично важливим також є інтерпретатор Hugs, але на сьогодні він не підтримується.
Haskell | |
---|---|
Парадигма | функційна, не строга, модульна |
Дата появи | 1990 |
Творці | d, d, d, d, d, d, Саймон Пейтон Джонс, d, d, d і d |
Розробник | d[1], d[2], d[3], Саймон Пейтон Джонс[4], d[4] і d[4] |
Останній реліз | Haskell 2010 (липень 2010)[5] |
Система типізації | сильна, статична |
Основні реалізації | GHC, GHCJS, , NHC, JHC, Yhc |
Діалекти | -- |
Під впливом від | APL, Lisp, , ML, , Scheme |
Вплинула на | Clojure, C#, F#, , LINQ, Perl 6, Python, Scala |
Операційна система | Windows і UNIX-подібні операційні системи |
Звичайні розширення файлів | .hs або .lhs |
Вебсайт | haskell.org |
|
Історія
На кінець 1980-их років вже існували деякі функційні мови програмування з власними перевагами та недоліками. Для того, аби наука отримала єдину основу для досліджень, слід було розробити стандартизовану сучасну функційну мову програмування. Тоді планувалось використати мову програмування як вихідний варіант, однак її розробники були в цьому не зацікавлені. Так в 1990 році і з'явилась мова програмування Haskell 1.0.
Поточна версія мови програмування є переробленим варіантом стандарта Haskell-98 1999 року. Зараз Гаскель є функційною мовою програмування, яка широко використовується як для досліджень, так і для реалізації комерційних проектів. Крім того, існує велика кількість варіантів мови програмування: Parallel Haskell, Distributed Haskell (раніше Gofin), Eager Haskell, Eden, DNA-Haskell, а також об'єктно-орієнтовані варіанти (Haskell++, O'Haskell, Mondrian). Для інших Гаскель був прикладом при розробці мови програмування. Наприклад, у випадку мови програмування Python було запозиченно концепцію та синтаксис роботи зі списками.
Застосування
Незважаючи на порівняно невелику спільноту Гаскеля, він уже показав свої сильні сторони у декількох проектах. — реалізація довгоочікуваної мови програмування Raku з інтерпретатором та компілятором, які показали корисність Гаскеля лише через кілька місяців від написання; також, GHC часто використовується як випробувальний стенд для передових можливостей функційного програмування та оптимізацій. Darcs — система керування версіями, яка має кілька інноваційних особливостей. Linspire GNU/Linux використовує Гаскель для розробки системних утиліт.xmonad — менеджер вікон для X Window System, цілком написаний на Гаскелі.
Особливості
Робота програм
- Гаскель є чистою функційною мовою програмування. Функції не мають жодних побічних ефектів. Це означає, що для одних і тих самих значень вхідних параметрів завжди повертатимуться однакові результати обчислень.
- Функційні мови програмування відрізняються від імперативних мов програмування тим, що програміст не повинен визначати порядок обчислення функцій. Розробнику слід лише описати залежність між даними, а транслятор вже самотужки визначає порядок обчислень на імперативному обчислювальному пристрої.
- Відсутні будь-які імперативні конструкції мови програмування. Завдяки монадам можливо виконувати операції вводу-виводу, інші обчислення, які вимагають збереження стану, в чисто функційному вигляді.
- Відсутні оператори зміни значення змінних. Через це відсутня різниця між константами та змінними. Як наслідок, відпадає необхідність у декларації const або final, які є, наприклад, в мовах програмування Сі та Java відповідно.
- Відсутня різниця між та об'єктів.
- Усунення проблем від наявності побічних ефектів значною мірою полегшує спостереження за послідовністю роботи програми.
- Гаскель є нестрогою мовою програмування. Обчислюються лише вирази, значення яких необхідне для обчислення результатів.
first x y = x square x = x * x
- Функція first при виклику з двома параметрами повертає значення першого. При виклику first x (3+7) обчислення значення суми (3+7) не потрібне для обчислення результата, і тому може не виконуватись.
- Функція square повертає значення квадрата переданого параметра. При обчисленні square (3+5) функція має обчислити (3+5)*(3+5), однак подвійне обчислення (3+5) не є оптимальним, і має уникатись.
- Реалізація лінивих обчислень полегшується відсутністю побічних ефектів та строгим дотриманням парадигми функційного програмування.
Система типів
- Гаскель є сильно типізованою мовою програмування. Розрізняються цілі, числа з рухомою комою, рядкові, та інші типи даних.
- Підримуються змінні типів. Завдяки цьому, можна робити узагальнені формулювання функцій. У випадку, коли така загальна функція застосовується до змінних з конкретним типом, автоматично визначаються і типи результатів решти обчислень.
- Функція map виконує надану функцію для кожного елемента зі списку. Її тип має вигляд:
map :: (a -> b) -> [a] -> [b]
- У випадку, якщо map буде викликано із функцією toUpper, яка має тип Char -> Char, вона матиме тип:
map toUpper :: [Char] -> [Char]
- Із самого початку Гаскель є мовою програмування зі статичною типізацією, хоча, існують варіанти з динамічною типізацією. Це значить, що для більшості обчислень, типи аргументів відомі вже на етапі трансляції. Це допомагає уникнути очевидних помилок ще до початку обчислень.
- Гаскель підтримує функції вищого порядку (функціонали). Тобто, функції, які можуть приймати як аргументи й повертати як результати функції. Одним із прикладів, є функція map, яка обчислює надану функцію f для кожного елемента одного типу (тут списка).
map :: (a -> b) -> [a] -> [b] map f [] = [] map f x:xs = f x : map f xs map square [1,2,3] = [square 1, square 2, square 3] = [1,4,9]
- Підтримується визначення типів даних користувачами. Ці типи даних визначаються використанням конструкторів типів даних.
data Tree Int = Leaf Int | Branch Int (Tree Int) (Tree Int)
- В прикладі наведено структуру даних дерев з наповенене цілими числами. Таким чином, дерево (Tree Int) складається або із листа (Leaf Int), або відгалуження (Branch Int t1 t2), де t1 та t2 містять піддерева, що мають структуру даних Tree Int. Для визначення цієї структури даних, треба, також, визначити конструктор Leaf з одним параметром, та конструктор Branch з трьома параметрами.
- Функції дозволяють каррінг. В той час, як в інших мовах програмування, як аргументи функції передаються кортежі, тобто, типи функцій мають вигляд (a,b) -> c, в Гаскель прийнято використовувати Каррі-подібну форму a -> b -> c. Завдяки цьому, стає можливим часткове обчислення значення функцій. Вираз map toUpper є прикладом часткового обчислення map, оскільки, він визначає функцію, а саме, функцію, що переводить всі літери у верхній регістр.
- Гаскель підтримує класи типів. Завдяки класифікації типів, можна визначити спільні операції для типів одного класу. В сигнатурах функцій можуть бути присутні як аргументи конкретного типу, приміром, Char та безтиповими змінними, визначатись аргументи з явно заданими обмеженнями типів.
- Всі застосування методу з класами типів мають однакове ім'я. Це, в деякому сенсі, відповідає функцій. Ім'я певної функції залежить від типів аргументів. Наприклад, метод == класу Eq порівнює як пару цифр, так і пару рядків. Однак, робота цього методу залежить від типів аргументів.
Синтаксис
Розрізняється регістр літер. Ідентифікатори, що починаються з великих літер, означають типи та конструктори. Ідентифікатори, що починаються з малої літери, означають змінні, функції, та параметри.
- Гаскель пропонує ряд синтаксичних особливостей. Вони мають допомагати висловлювати все відповідно до функційної парадигми.
Замість
readFile "input.txt" >>= writeFile "output.txt"
або
readFile "input.txt" >>= (\content -> writeFile "output.txt" content)
можна також написати
do content <- readFile "input.txt" writeFile "output.txt" content
- Як символьні (такі як +, -, *, /, >, <), так і алфавітно-цифрові ідентифікатори (літери, цифри, апостроф) можуть використовуватись і як назви функцій, і як інфіксні та постфіксні оператори. Наприклад, можна писати:
a + b == (+) a b a `div` b == div a b
Програмування
- Гаскель підтримує . Тобто, як формальні параметри можна передавати шаблони. При цьому, описані шаблони стають аргументами функції.
fac :: Integer -> Integer fac 0 = 1 fac n = n * fac (n-1)
- Функція fac обчислює факторіал числа. При виклику функції з параметром, що дорівнює 0, буде повернута 1. Для всіх інших випадків, обчислення факторіала відбувається шляхом рекурсивного виклику n*fac(n-1). В цьому прикладі, 0 та 1 є шаблонами, від збігу з якими залежить результат обчислень.
Модулі
Гаскель, також, має систему модулів. Існує велика кількість модулів, в яких реалізовано багато корисних функцій. Один із найповніших переліків існуючих модулів міститься в Haskell Reference [ 16 листопада 2006 у Wayback Machine.](англ.).
Для того, аби використати модуль, необхідно його . Це робиться з використанням ключового слова import:
import List import Maybe
Різні модулі можуть містити функції та типи з однаковими назвами. Ці ідентифікатори можна розрізняти шляхом:
- імпортування лише одного ідентифікатора,
import Data.List(delete) x = delete 'a' "abc
- використанням повної (разом із модулем) назви ідентифікатора:
import qualified Data.List x = Data.List.delete 'a' "abc
або
import qualified Data.List as List x = List.delete 'a' "abc"
Можливим, але не бажаним є приховування ідентифікаторів деклараціями hiding.
Приклади
Факторіал
Елегантне визначення функції факторіалу, яке використовує нотацію Гаскеля для списків:
fac :: Integer -> Integer fac n = product [1..n]
Числа Фібоначчі
Наївна реалізація функції обчислення n числа з Послідовності Фібоначчі:
fib :: Integer -> Integer fib 0 = 0 fib 1 = 1 fib n = fib (n - 2) + fib (n - 1)
Швидша реалізація обчислення послідовності:
fibs :: [Integer] fibs = 0 : 1 : (zipWith (+) fibs (tail fibs))
Швидке сортування
Алгоритм швидкого сортування записується мовою Гаскель так:
qsort :: Ord a => [a] -> [a] qsort [] = [] qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y <- xs, y >= x]
У першому рядку визначається сигнатура функції qsort. В другому рядку визначається, що результат застосування функції для порожнього списка є також порожній список. В третьому рядку відбувається рекурсивне сортування непорожніх списків: перший елемент x береться як середній елемент результуючого списка. Перед ним сортуються всі менші, а після нього — всі більші елементи списка. Для того, аби вибрати всі менші та більші елементи ніж x із хвоста списка xs, використано описання списків.
Як і очікується від алгоритму швидкого сортування, середній асимптотичний час роботи цього алгоритму дорівнює а час роботи в найгіршому випдаку дорівнює . На відміну від звичайних реалізацій в імперативних мовах програмування, описана функція працює не перетираючи вхідний масив.
Споріднені програми та інструменти
- Cabal — це інструмент для збору та пакування бібліотек та програм Гаскеля.
- Stack — це інструмент для збірки програм та управління залежностями компонентів Гаскель. Він використовує бібліотеку Cabal з своєю версією репозиторія , який називається .
- Linspire Linux використовує Гаскель для програмування системних компонент.
- Pandoc — це програма для конвертування багатьох типів формату markup в інші.
Див. також
- ML
- (імплементація Перл версії 6 на Гаскель)
- Система F
- Функційне програмування
Виноски
- http://news.yale.edu/2015/04/30/memoriam-paul-hudak-computer-scientist-and-saybrook-college-master
- http://softwareengineeringdaily.com/2015/11/05/haskell-with-lennart-augustsson/
- http://www.cse.chalmers.se/~rjmh/Software/h++.html
- A history of Haskell:being lazy with class — SIGPLAN, 2007.
- [Haskell Announcing Haskell 2010] — 2009.
- Linspire/Freespire Core OS Team and Haskell. Debian Haskell mailing list. May 2006. Архів оригіналу за 25 червня 2013. Процитовано 18 листопада 2007.
- https://www.haskell.org/cabal.
{{}}
: Пропущений або порожній|title=
()
Література
- Why Functional Programming Matters by John Hughes, The Computer Journal, Vol. 32, No. 2, 1989, pp. 98 — 107. Переваги функційного програмування. Наводяться приклади модульності програм на основі функцій вищого порядку та лінивих обчислень.
- Simon Thompson: Haskell — The Craft of Functional Programming, 1999, Addison-Wesley,
- Paul Hudak: The Haskell School of Expression — Learning Functional Programming Through Multimedia., 2000, Cambridge University Press,
- Міран Ліповача: Вивчить собі Гаскела на велике щастя! [ 2 березня 2021 у Wayback Machine.] (переклад українською http://learnyouahaskell.com [ 12 січня 2021 у Wayback Machine.])
Посилання
- http://www.haskell.org/ — Центральний портал мови програмування Гаскель.
- — Корисна інформація для вивчення Гаскель.
- http://www.haskell.org/hugs/ [ 3 лютого 2006 у Wayback Machine.] — Hugs 98, безкоштовний інтерпретатор Гаскель.
- — Наукова література про Гаскель.
- http://haskell.trygub.com [ 2 березня 2021 у Wayback Machine.] — сайт-книга «Вивчить собі Гаскела на велике щастя!»
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Haskell ukr Gaskel Gaskell standartizovana vinyatkovo funkcijna mova programuvannya z nestrogoyu semantikoyu Nazvana na chest amerikanskogo matematika Gaskella Karri roboti yakogo v galuzi matematichnoyi logiki ye bazovimi dlya funkcijnogo programuvannya Gaskel bazuyetsya na lyambda chislenni Najvazhlivishimi realizaciyami ye kompilyator Glasgow Haskell Compiler GHC ta osnovanij na nomu kompilyator GHCJS sho kompilyuye Gaskel kod u skript movoyu JavaScript Istorichno vazhlivim takozh ye interpretator Hugs ale na sogodni vin ne pidtrimuyetsya HaskellParadigmafunkcijna ne stroga modulnaData poyavi1990Tvorcid d d d d d Sajmon Pejton Dzhons d d d i dRozrobnikd 1 d 2 d 3 Sajmon Pejton Dzhons 4 d 4 i d 4 Ostannij relizHaskell 2010 lipen 2010 5 Sistema tipizaciyisilna statichnaOsnovni realizaciyiGHC GHCJS NHC JHC YhcDialekti Pid vplivom vidAPL Lisp ML SchemeVplinula naClojure C F LINQ Perl 6 Python ScalaOperacijna sistemaWindows i UNIX podibni operacijni sistemiZvichajni rozshirennya fajliv hs abo lhsVebsajthaskell org Mediafajli u VikishovishiIstoriyaNa kinec 1980 ih rokiv vzhe isnuvali deyaki funkcijni movi programuvannya z vlasnimi perevagami ta nedolikami Dlya togo abi nauka otrimala yedinu osnovu dlya doslidzhen slid bulo rozrobiti standartizovanu suchasnu funkcijnu movu programuvannya Todi planuvalos vikoristati movu programuvannya yak vihidnij variant odnak yiyi rozrobniki buli v comu ne zacikavleni Tak v 1990 roci i z yavilas mova programuvannya Haskell 1 0 Potochna versiya movi programuvannya ye pereroblenim variantom standarta Haskell 98 1999 roku Zaraz Gaskel ye funkcijnoyu movoyu programuvannya yaka shiroko vikoristovuyetsya yak dlya doslidzhen tak i dlya realizaciyi komercijnih proektiv Krim togo isnuye velika kilkist variantiv movi programuvannya Parallel Haskell Distributed Haskell ranishe Gofin Eager Haskell Eden DNA Haskell a takozh ob yektno oriyentovani varianti Haskell O Haskell Mondrian Dlya inshih Gaskel buv prikladom pri rozrobci movi programuvannya Napriklad u vipadku movi programuvannya Python bulo zapozichenno koncepciyu ta sintaksis roboti zi spiskami ZastosuvannyaNezvazhayuchi na porivnyano neveliku spilnotu Gaskelya vin uzhe pokazav svoyi silni storoni u dekilkoh proektah realizaciya dovgoochikuvanoyi movi programuvannya Raku z interpretatorom ta kompilyatorom yaki pokazali korisnist Gaskelya lishe cherez kilka misyaciv vid napisannya takozh GHC chasto vikoristovuyetsya yak viprobuvalnij stend dlya peredovih mozhlivostej funkcijnogo programuvannya ta optimizacij Darcs sistema keruvannya versiyami yaka maye kilka innovacijnih osoblivostej Linspire GNU Linux vikoristovuye Gaskel dlya rozrobki sistemnih utilit xmonad menedzher vikon dlya X Window System cilkom napisanij na Gaskeli OsoblivostiRobota program Gaskel ye chistoyu funkcijnoyu movoyu programuvannya Funkciyi ne mayut zhodnih pobichnih efektiv Ce oznachaye sho dlya odnih i tih samih znachen vhidnih parametriv zavzhdi povertatimutsya odnakovi rezultati obchislen Funkcijni movi programuvannya vidriznyayutsya vid imperativnih mov programuvannya tim sho programist ne povinen viznachati poryadok obchislennya funkcij Rozrobniku slid lishe opisati zalezhnist mizh danimi a translyator vzhe samotuzhki viznachaye poryadok obchislen na imperativnomu obchislyuvalnomu pristroyi Vidsutni bud yaki imperativni konstrukciyi movi programuvannya Zavdyaki monadam mozhlivo vikonuvati operaciyi vvodu vivodu inshi obchislennya yaki vimagayut zberezhennya stanu v chisto funkcijnomu viglyadi Vidsutni operatori zmini znachennya zminnih Cherez ce vidsutnya riznicya mizh konstantami ta zminnimi Yak naslidok vidpadaye neobhidnist u deklaraciyi const abo final yaki ye napriklad v movah programuvannya Si ta Java vidpovidno Vidsutnya riznicya mizh ta ob yektiv Usunennya problem vid nayavnosti pobichnih efektiv znachnoyu miroyu polegshuye sposterezhennya za poslidovnistyu roboti programi Gaskel ye nestrogoyu movoyu programuvannya Obchislyuyutsya lishe virazi znachennya yakih neobhidne dlya obchislennya rezultativ first x y x square x x x Funkciya first pri vikliku z dvoma parametrami povertaye znachennya pershogo Pri vikliku first x 3 7 obchislennya znachennya sumi 3 7 ne potribne dlya obchislennya rezultata i tomu mozhe ne vikonuvatis Funkciya square povertaye znachennya kvadrata peredanogo parametra Pri obchislenni square 3 5 funkciya maye obchisliti 3 5 3 5 odnak podvijne obchislennya 3 5 ne ye optimalnim i maye unikatis Realizaciya linivih obchislen polegshuyetsya vidsutnistyu pobichnih efektiv ta strogim dotrimannyam paradigmi funkcijnogo programuvannya Sistema tipiv Gaskel ye silno tipizovanoyu movoyu programuvannya Rozriznyayutsya cili chisla z ruhomoyu komoyu ryadkovi ta inshi tipi danih Pidrimuyutsya zminni tipiv Zavdyaki comu mozhna robiti uzagalneni formulyuvannya funkcij U vipadku koli taka zagalna funkciya zastosovuyetsya do zminnih z konkretnim tipom avtomatichno viznachayutsya i tipi rezultativ reshti obchislen Funkciya map vikonuye nadanu funkciyu dlya kozhnogo elementa zi spisku Yiyi tip maye viglyad map a gt b gt a gt b U vipadku yaksho map bude viklikano iz funkciyeyu toUpper yaka maye tip Char gt Char vona matime tip map toUpper Char gt Char Iz samogo pochatku Gaskel ye movoyu programuvannya zi statichnoyu tipizaciyeyu hocha isnuyut varianti z dinamichnoyu tipizaciyeyu Ce znachit sho dlya bilshosti obchislen tipi argumentiv vidomi vzhe na etapi translyaciyi Ce dopomagaye uniknuti ochevidnih pomilok she do pochatku obchislen Gaskel pidtrimuye funkciyi vishogo poryadku funkcionali Tobto funkciyi yaki mozhut prijmati yak argumenti j povertati yak rezultati funkciyi Odnim iz prikladiv ye funkciya map yaka obchislyuye nadanu funkciyu f dlya kozhnogo elementa odnogo tipu tut spiska map a gt b gt a gt b map f map f x xs f x map f xs map square 1 2 3 square 1 square 2 square 3 1 4 9 Pidtrimuyetsya viznachennya tipiv danih koristuvachami Ci tipi danih viznachayutsya vikoristannyam konstruktoriv tipiv danih data Tree Int Leaf Int Branch Int Tree Int Tree Int V prikladi navedeno strukturu danih derev z napovenene cilimi chislami Takim chinom derevo Tree Int skladayetsya abo iz lista Leaf Int abo vidgaluzhennya Branch Int t1 t2 de t1 ta t2 mistyat piddereva sho mayut strukturu danih Tree Int Dlya viznachennya ciyeyi strukturi danih treba takozh viznachiti konstruktor Leaf z odnim parametrom ta konstruktor Branch z troma parametrami Funkciyi dozvolyayut karring V toj chas yak v inshih movah programuvannya yak argumenti funkciyi peredayutsya kortezhi tobto tipi funkcij mayut viglyad a b gt c v Gaskel prijnyato vikoristovuvati Karri podibnu formu a gt b gt c Zavdyaki comu staye mozhlivim chastkove obchislennya znachennya funkcij Viraz map toUpper ye prikladom chastkovogo obchislennya map oskilki vin viznachaye funkciyu a same funkciyu sho perevodit vsi literi u verhnij registr Gaskel pidtrimuye klasi tipiv Zavdyaki klasifikaciyi tipiv mozhna viznachiti spilni operaciyi dlya tipiv odnogo klasu V signaturah funkcij mozhut buti prisutni yak argumenti konkretnogo tipu primirom Char ta beztipovimi zminnimi viznachatis argumenti z yavno zadanimi obmezhennyami tipiv Vsi zastosuvannya metodu z klasami tipiv mayut odnakove im ya Ce v deyakomu sensi vidpovidaye funkcij Im ya pevnoyi funkciyi zalezhit vid tipiv argumentiv Napriklad metod klasu Eq porivnyuye yak paru cifr tak i paru ryadkiv Odnak robota cogo metodu zalezhit vid tipiv argumentiv Sintaksis Rozriznyayetsya registr liter Identifikatori sho pochinayutsya z velikih liter oznachayut tipi ta konstruktori Identifikatori sho pochinayutsya z maloyi literi oznachayut zminni funkciyi ta parametri Gaskel proponuye ryad sintaksichnih osoblivostej Voni mayut dopomagati vislovlyuvati vse vidpovidno do funkcijnoyi paradigmi Zamist readFile input txt gt gt writeFile output txt abo readFile input txt gt gt content gt writeFile output txt content mozhna takozh napisati do content lt readFile input txt writeFile output txt content Yak simvolni taki yak gt lt tak i alfavitno cifrovi identifikatori literi cifri apostrof mozhut vikoristovuvatis i yak nazvi funkcij i yak infiksni ta postfiksni operatori Napriklad mozhna pisati a b a b a div b div a b Programuvannya Gaskel pidtrimuye Tobto yak formalni parametri mozhna peredavati shabloni Pri comu opisani shabloni stayut argumentami funkciyi fac Integer gt Integer fac 0 1 fac n n fac n 1 Funkciya fac obchislyuye faktorial chisla Pri vikliku funkciyi z parametrom sho dorivnyuye 0 bude povernuta 1 Dlya vsih inshih vipadkiv obchislennya faktoriala vidbuvayetsya shlyahom rekursivnogo vikliku n fac n 1 V comu prikladi 0 ta 1 ye shablonami vid zbigu z yakimi zalezhit rezultat obchislen Moduli Gaskel takozh maye sistemu moduliv Isnuye velika kilkist moduliv v yakih realizovano bagato korisnih funkcij Odin iz najpovnishih perelikiv isnuyuchih moduliv mistitsya v Haskell Reference 16 listopada 2006 u Wayback Machine angl Dlya togo abi vikoristati modul neobhidno jogo Ce robitsya z vikoristannyam klyuchovogo slova import import List import Maybe Rizni moduli mozhut mistiti funkciyi ta tipi z odnakovimi nazvami Ci identifikatori mozhna rozriznyati shlyahom importuvannya lishe odnogo identifikatora import Data List delete x delete a abc vikoristannyam povnoyi razom iz modulem nazvi identifikatora import qualified Data List x Data List delete a abc abo import qualified Data List as List x List delete a abc Mozhlivim ale ne bazhanim ye prihovuvannya identifikatoriv deklaraciyami hiding PrikladiFaktorial Elegantne viznachennya funkciyi faktorialu yake vikoristovuye notaciyu Gaskelya dlya spiskiv fac Integer gt Integer fac n product 1 n Chisla Fibonachchi Nayivna realizaciya funkciyi obchislennya n chisla z Poslidovnosti Fibonachchi fib Integer gt Integer fib 0 0 fib 1 1 fib n fib n 2 fib n 1 Shvidsha realizaciya obchislennya poslidovnosti fibs Integer fibs 0 1 zipWith fibs tail fibs Shvidke sortuvannya Algoritm shvidkogo sortuvannya zapisuyetsya movoyu Gaskel tak qsort Ord a gt a gt a qsort qsort x xs qsort y y lt xs y lt x x qsort y y lt xs y gt x U pershomu ryadku viznachayetsya signatura funkciyi qsort V drugomu ryadku viznachayetsya sho rezultat zastosuvannya funkciyi dlya porozhnogo spiska ye takozh porozhnij spisok V tretomu ryadku vidbuvayetsya rekursivne sortuvannya neporozhnih spiskiv pershij element x beretsya yak serednij element rezultuyuchogo spiska Pered nim sortuyutsya vsi menshi a pislya nogo vsi bilshi elementi spiska Dlya togo abi vibrati vsi menshi ta bilshi elementi nizh x iz hvosta spiska xs vikoristano opisannya spiskiv Yak i ochikuyetsya vid algoritmu shvidkogo sortuvannya serednij asimptotichnij chas roboti cogo algoritmu dorivnyuye O n log n displaystyle O n cdot log n a chas roboti v najgirshomu vipdaku dorivnyuye O n2 displaystyle O n 2 Na vidminu vid zvichajnih realizacij v imperativnih movah programuvannya opisana funkciya pracyuye ne peretirayuchi vhidnij masiv Sporidneni programi ta instrumentiCabal ce instrument dlya zboru ta pakuvannya bibliotek ta program Gaskelya Stack ce instrument dlya zbirki program ta upravlinnya zalezhnostyami komponentiv Gaskel Vin vikoristovuye biblioteku Cabal z svoyeyu versiyeyu repozitoriya yakij nazivayetsya Linspire Linux vikoristovuye Gaskel dlya programuvannya sistemnih komponent Pandoc ce programa dlya konvertuvannya bagatoh tipiv formatu markup v inshi Div takozhML implementaciya Perl versiyi 6 na Gaskel Sistema F Funkcijne programuvannyaVinoskihttp news yale edu 2015 04 30 memoriam paul hudak computer scientist and saybrook college master http softwareengineeringdaily com 2015 11 05 haskell with lennart augustsson http www cse chalmers se rjmh Software h html A history of Haskell being lazy with class SIGPLAN 2007 d Track Q3412172 Haskell Announcing Haskell 2010 2009 Linspire Freespire Core OS Team and Haskell Debian Haskell mailing list May 2006 Arhiv originalu za 25 chervnya 2013 Procitovano 18 listopada 2007 https www haskell org cabal a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Propushenij abo porozhnij title dovidka LiteraturaWhy Functional Programming Matters by John Hughes The Computer Journal Vol 32 No 2 1989 pp 98 107 Perevagi funkcijnogo programuvannya Navodyatsya prikladi modulnosti program na osnovi funkcij vishogo poryadku ta linivih obchislen Simon Thompson Haskell The Craft of Functional Programming 1999 Addison Wesley ISBN 0 201 34275 8 Paul Hudak The Haskell School of Expression Learning Functional Programming Through Multimedia 2000 Cambridge University Press ISBN 0 521 64338 4 Miran Lipovacha Vivchit sobi Gaskela na velike shastya 2 bereznya 2021 u Wayback Machine pereklad ukrayinskoyu http learnyouahaskell com 12 sichnya 2021 u Wayback Machine Posilannyahttp www haskell org Centralnij portal movi programuvannya Gaskel Korisna informaciya dlya vivchennya Gaskel http www haskell org hugs 3 lyutogo 2006 u Wayback Machine Hugs 98 bezkoshtovnij interpretator Gaskel Naukova literatura pro Gaskel http haskell trygub com 2 bereznya 2021 u Wayback Machine sajt kniga Vivchit sobi Gaskela na velike shastya