Направо към съдържанието

Haskell

от Уикипедия, свободната енциклопедия
Haskell
Logo of 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 е базиран на ламбда смятане, следователно ламбда се използва за негово лого.[17] Поради близостта си с математиката и богатството от математически библиотеки езикът е широко използван за решаване на кратки математически задачи.

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 („Haskell 1.0“) е очертана през 1990 г. Усилията на комитета дават като резултат серия от езикови дефиниции (1.0, 1.1, 1.2, 1.3, 1.4).

В края на 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 стандарт.

В началото на 2006 започва процес на създаване на приемник на Haskell 98 стандарта, под неофициалното име Haskell Prime. Целта е това да бъде непрекъснат процес на ревизиране на езиковите дефиниции, с поне една ревизия годишно. Първата ревизирана версия, наречена Haskell 2010, е анонсирана през ноември 2009 и публикувана през юли 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]

Технически доклади
История
  1. а б в г д е ж з и к л м н о Haskell 98 Language and Libraries: The Revised Report. Cambridge University Press, 2003. ISBN 0521826144.
  2. Norell, Ulf. Dependently Typed Programming in Agda // Chalmers University, 2008. Посетен на 24 октомври 2014.
  3. а б в г д е ж з и к л 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.
  4. Stroustrup, Bjarne и др. Design of Concept Libraries for C++ // Proceedings of the International Conference on Software Language Engineering. 2011. Посетен на 24 октомври 2014.
  5. а б Meijer, Erik. Confessions of a Used Programming Language Salesman: Getting the Masses Hooked on Haskell // OOPSLA 2007.
  6. Meijer, Erik. C9 Lectures: Dr. Erik Meijer – Functional Programming Fundamentals, Chapter 1 of 13 // Channel 9. Microsoft, 1 октомври 2009. Архивиран от оригинала на 2012-06-16. Посетен на 9 февруари 2012.
  7. Drobi, Sadek. Erik Meijer on LINQ // InfoQ. QCon SF 2008, C4Media Inc., 4 март 2009. Посетен на 9 февруари 2012.
  8. Heller, Martin. Turn up your nose at Dart and smell the CoffeeScript // JavaWorld. InfoWorld, 18 октомври 2011. Архивиран от оригинала. Посетен на 9 февруари 2012.
  9. Syme, Don, Granicz, Adam, Cisternino, Antonio. Expert F#. Apress, 2007. с. 2. F# also draws from Haskell particularly with regard to two advanced language features called sequence expressions and workflows.
  10. Wechsung, Ingo. The Frege Programming Language // Посетен на 24 октомври 2014.
  11. Idris, a language with dependent types // Посетен на 26 октомври 2014.
  12. LiveScript Inspiration // Посетен на 24 октомври 2014.
  13. Glossary of Terms and Jargon // Perl Foundation Perl 6 Wiki. The Perl Foundation, 28 февруари. Архивиран от оригинала на 2012-01-21. Посетен на 9 февруари 2012.
  14. Kuchling, A. M. Functional Programming HOWTO // Python v2.7.2 documentation. Python Software Foundation. Посетен на 24 октомври 2014.
  15. Fogus, Michael. MartinOdersky take(5) toList // Send More Paramedics. 6 август 2010. Посетен на 9 февруари 2012.
  16. Lattner, Chris. Chris Lattner's Homepage // Chris Lattner, 3 юни 2014. Посетен на 24 октомври 2014. The Swift language is the product of tireless effort from a team of language experts, documentation gurus, compiler optimization ninjas, and an incredibly important internal dogfooding group who provided feedback to help refine and battle-test ideas. Of course, it also greatly benefited from the experiences hard-won by many other languages in the field, drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.
  17. The Haskell Programming Language
  18. learnyouahaskell.com
  Тази страница частично или изцяло представлява превод на страницата Haskell_programming_language в Уикипедия на английски. Оригиналният текст, както и този превод, са защитени от Лиценза „Криейтив Комънс – Признание – Споделяне на споделеното“, а за съдържание, създадено преди юни 2009 година – от Лиценза за свободна документация на ГНУ. Прегледайте историята на редакциите на оригиналната страница, както и на преводната страница, за да видите списъка на съавторите. ​

ВАЖНО: Този шаблон се отнася единствено до авторските права върху съдържанието на статията. Добавянето му не отменя изискването да се посочват конкретни източници на твърденията, които да бъдат благонадеждни.​