Loading AI tools
З Вікіпедії, вільної енциклопедії
Haskell (укр. Гаскель, Гаскелл) — стандартизована, винятково функційна мова програмування з нестрогою семантикою. Названа на честь американського математика Гаскелла Каррі, роботи якого в галузі математичної логіки є базовими для функційного програмування. Гаскель базується на лямбда численні. Найважливішими реалізаціями є компілятор Glasgow Haskell Compiler (GHC) та оснований на ньому компілятор GHCJS, що компілює Гаскель-код у скрипт мовою JavaScript. Історично важливим також є інтерпретатор Hugs, але на сьогодні він не підтримується.
Haskell | |
---|---|
Парадигма | функційна, не строга, модульна |
Дата появи | 1990 |
Творці | Lennart Augustssond, Warren Burtond, Kevin Hammondd, Paul Hudakd, John Hughesd, Thomas Johnssond, Саймон Пейтон Джонс, John Launchburyd, Erik Meijerd, Alastair Reidd і Philip Wadlerd |
Розробник | Paul Hudakd[1], Lennart Augustssond[2], John Hughesd[3], Саймон Пейтон Джонс[4], Erik Meijerd[4] і Philip Wadlerd[4] |
Останній реліз | Haskell 2010 (липень 2010)[5] |
Система типізації | сильна, статична |
Основні реалізації | GHC, GHCJS, Hugs, NHC, JHC, Yhc |
Діалекти | -- |
Під впливом від | APL, Lisp, Miranda, ML, Gofer, Scheme |
Вплинула на | Clojure, C#, F#, Java Generics, 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 було запозиченно концепцію Лямбда-нотації та синтаксис роботи зі списками.
Незважаючи на порівняно невелику спільноту Гаскеля, він уже показав свої сильні сторони у декількох проектах. Pugs — реалізація довгоочікуваної мови програмування Raku з інтерпретатором та компілятором, які показали корисність Гаскеля лише через кілька місяців від написання; також, GHC часто використовується як випробувальний стенд для передових можливостей функційного програмування та оптимізацій. Darcs — система керування версіями, яка має кілька інноваційних особливостей. Linspire GNU/Linux використовує Гаскель для розробки системних утиліт.[6] xmonad — менеджер вікон для X Window System, цілком написаний на Гаскелі.
first x y = x
square x = x * x
map :: (a -> b) -> [a] -> [b]
map toUpper :: [Char] -> [Char]
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)
Розрізняється регістр літер. Ідентифікатори, що починаються з великих літер, означають типи та конструктори. Ідентифікатори, що починаються з малої літери, означають змінні, функції, та параметри.
Замість
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)
Гаскель, також, має систему модулів. Існує велика кількість модулів, в яких реалізовано багато корисних функцій. Один із найповніших переліків існуючих модулів міститься в 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, використано описання списків.
Як і очікується від алгоритму швидкого сортування, середній асимптотичний час роботи цього алгоритму дорівнює а час роботи в найгіршому випдаку дорівнює . На відміну від звичайних реалізацій в імперативних мовах програмування, описана функція працює не перетираючи вхідний масив.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.