Haskell
From Wikipedia, the free encyclopedia
Haskell (Ха̀скъл) е функционален език за програмиране. В частност, той е полиморфично статично-типизиран, „мързелив“ (нищо не се прави, докато не се наложи), чисто функционален език, доста различен от повечето езици за програмиране. Името му е в чест на логика Хаскел Къри, чийто труд в областта на математическата логика е в основата на създаването на функционалните езици. Haskell е базиран на ламбда смятане, следователно ламбда се използва за негово лого.[17] Поради близостта си с математиката и богатството от математически библиотеки езикът е широко използван за решаване на кратки математически задачи.
Haskell | |
![]() | |
Парадигма | функционален, lazy, modular |
---|---|
Реализиране през | 1990 |
Автор | Саймън Пейтън-Джоунс, Филип Уадлър |
Типизация на данните | статична |
Програмни диалекти | Helium |
Повлиян от | lambda calculus,[1] Miranda,[1] Clean,[1] FP,[1] Gofer,[1] Hope and Hope+,[1] Id,[1] ISWIM,[1] KRC,[1] Lisp,[1] ML and Standard ML,[1] Orwell, SASL,[1] SISAL,[1] Scheme[1] |
Повлиява | Agda,[2] Bluespec,[3] C++11/Concepts,[4] C#/LINQ,[3][5][6][7] Cayenne,[3] Clean,[3] CoffeeScript,[8] Curry,[3] F#,[9] Frege,[10] Idris[11] Isabelle,[3] Java/Generics,[3] LiveScript,[12] Mercury,[3] Perl 6,[13] Python,[3][14] Scala,[3][15] Swift,[16] Visual Basic 9.0[3][5] |
Уебсайт | haskell.org |
Haskell в Общомедия |
Haskell се радва на широка общност от потребители, които непрекъснато допринасят нови библиотеки и функционалности. Haskell и SQL повлияват създаването на LINQ (Microsoft .NET Framework).
Компилатор
Най-използваният Haskell компилатор e GHC (The Glasgow Haskell Compiler). GHC e наличен за GNU/Linux, FreeBSD, MacOS, Windows, and Solaris. След като бъде инсталиран, с него се получават ghc и ghci. Първото компилира Haskell приложенията или библиотеки до двоичен код. Второто е интерпретатор, който позволява на разработчика да пише Haskell код и да получава обратна връзка (при грешка) на момента.
История
След излизането на Miranda през 1985 г., продукт на Research Software Ltd, интересът към „ленивите“ функционални езици нараства, като до 1987 г. вече съществуват повече от дузина чисто функционални програмни езици. От тях Miranda бил най-широко използваният език, но от тип със затворен код. На конференцията по Функционални програмни езици и компютърна архитектура (FPCA '87) в Портланд (Орегон), участниците постигат консенсус за създаването на комитет, който ще е отговорен за дефинирането на отворен стандарт за такива езици. Задачата на комитета била да се обединят съществуващите функционални езици в един–единствен, който да служи като основа за бъдещи изследвания в областта на функционалните програмни езици.
Haskell 1.0 до 1.4
Първата версия на Haskell („Haskell 1.0“) е очертана през 1990 г. Усилията на комитета дават като резултат серия от езикови дефиниции (1.0, 1.1, 1.2, 1.3, 1.4).
Haskell 98
В края на 1997 година поредицата кулминира в Haskell 98, предназначен да придаде стабилна, минимална, преносима версия на езика, с придружаваща библиотека за обучение и да служи като база за бъдещи разширения. Комитетът специално приветства създаването на разширения и варианти на Haskell 98 чрез добавяне и включване на експериментални функции.
През февруари 1999-a, Haskell 98 езиков стандарт е публикуван като „The Haskell 98 Report“. През януари 2003 е публикувана първата ревизирана версия, наречена „Haskell 98 Language and Libraries: The Revised Report“. Езикът продължава да се развива бързо, и така Glasgow Haskell Compiler (GHC) въведенията, представляват настоящия de facto стандарт.
Haskell Prime
В началото на 2006 започва процес на създаване на приемник на Haskell 98 стандарта, под неофициалното име Haskell Prime. Целта е това да бъде непрекъснат процес на ревизиране на езиковите дефиниции, с поне една ревизия годишно. Първата ревизирана версия, наречена Haskell 2010, е анонсирана през ноември 2009 и публикувана през юли 2010 година.
Haskell 2010
Haskell 2010 добавя интерфейса на външна функция (Foreign Function Interface FFI) към Haskell, което позволява свързване към други програмни езици, поправя някои синтактични проблеми (промени в официалната граматика) и забранява така наречените „n-plus-k-patterns“, т.е. дефиниции във форма fact (n+1) = (n+1) * fact n не са вече позволени. Той въвежда Language-Pragma-Syntax-Extension, което позволява Haskell източника да се разпознае като Haskell 2010, и добавя към модифицирания Haskell някои разширения. Имената на разширенията, въведени в Haskell 2010, са „DoAndIfThenElse“, „HierarchicalModules“, „EmptyDataDeclarations“, „FixityResolution“, „ForeignFunctionInterface“, „LineCommentSyntax“, „PatternGuards, RelaxedDependencyAnalysis“, „LanguagePragma and NoNPlusKPatterns“.
Характеристики
Haskell използва „мързеливи“ изчисления (lazy evaluation), pattern matching, list comprehension, класове-типове и полиморфизъм. Това е чисто функционален език, което означава, че като цяло функциите в Haskell нямат странични ефекти. Съществува ясна конструкция за представяне на странични ефекти, независима от типа на функциите. Една чиста функция може да върне страничен ефект, който впоследствие се изпълнява, подобно на нечистите(impure functions) функциите при другите езици.
Haskell има силна, статична система от типове, базирана на системата от типове на Хиндли – Милнър. Основната иновация при Haskell в тази област е да се добавят класове-типове, които първоначално са били замислени като принципен начин за добавяне на овърлоуд към езика, но оттогава те намират още много други приложения.
Езикът има отворена, публикувана спецификация и множество приложения. Основното приложение на Haskell, GHC, е едновременно преводач и компилатор, който работи на повечето платформи.
Налице е активна общност около този език и повече от 5400 библиотеки и инструменти с отворен код на разположение в онлайн хранилището Hackage.
Примерен код
- Примерът Hello world:
module Main where
main :: IO ()
main = putStrLn "Hello, World!"
- Пресмятане на Факториел, функция дефинирана по няколко начина:
-- Type annotation (optional)
factorial :: (Integral a) => a -> a
-- Using recursion
factorial n | n < 2 = 1
factorial n = n * factorial (n – 1)
-- Using recursion, with guards
factorial n
| n < 2 = 1
| otherwise = n * factorial (n – 1)
-- Using recursion but written without pattern matching
factorial n = if n > 0 then n * factorial (n-1) else 1
-- Using a list
factorial n = product [1..n]
-- Using fold (implements product)
factorial n = foldl (*) 1 [1..n]
-- Point-free style
factorial = foldr (*) 1 . enumFromTo 1
-- Type annotation (optional)
fib :: Int -> Integer
-- With self-referencing data
fib n = fibs !! n
where fibs = 0 : scanl (+) 1 fibs
-- 0,1,1,2,3,5,...
-- Same, coded directly
fib n = fibs !! n
where fibs = 0 : 1 : next fibs
next (a : t@(b:_)) = (a+b) : next t
-- Similar idea, using zipWith
fib n = fibs !! n
where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
-- Using a generator function
fib n = fibs (0,1) !! n
where fibs (a,b) = a : fibs (b,a+b)
- Функция, сортираща списък чрез алгоритъма Quicksort:
qsort [] = []
qsort (x:xs) = qsort l ++ [x] ++ qsort g
where
l = [ y | y <- xs, y <= x ]
g = [ y | y <- xs, y > x ]
Особености на езика
Haskell e статично-типизиран език. Когато кодът се компилира, компилаторът знае кое парче код е число, кое string и т.н, поради което множество възможни грешки се улавят още по време на компилация. Пример – ако се пробва събиране на число и string, компилаторът ще алармира, че това не може да се случи. Haskell има система за типово разпознаване (type inference). Това означава, че не е нужно изрично да се обявява от какъв тип данни е дадена променлива. Пример – ако се напише 5 + 4, не е нужно да се казва на компилатора, че това е число, той ще разбере сам. [18]
Външни препратки
- Технически доклади
- Haskell 98 Language and Libraries: The Revised Report. Cambridge University Press, 2003. ISBN 0521826144.
- История
- Hudak, Paul и др. A History of Haskell: Being Lazy with Class // Proceedings of the third ACM SIGPLAN conference on History of programming languages (HOPL III). 2007. ISBN 978-1-59593-766-7. DOI:10.1145/1238844.1238856.
Вижте също
Бележки
Wikiwand - on
Seamless Wikipedia browsing. On steroids.