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 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.

Примерен код[редактиране | редактиране на кода]

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 October 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.
  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 October 2009. Посетен на 9 February 2012.
  7. Drobi, Sadek. Erik Meijer on LINQ. // InfoQ. QCon SF 2008, C4Media Inc., 4 March 2009. Посетен на 9 February 2012.
  8. Heller, Martin. Turn up your nose at Dart and smell the CoffeeScript. // JavaWorld. InfoWorld, 18 October 2011. Посетен на 9 February 2012.
  9. 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. // Посетен на 2014-10-24.
  11. Idris, a language with dependent types. // Посетен на 2014-10-26.
  12. LiveScript Inspiration. // Посетен на 2014-10-24.
  13. Glossary of Terms and Jargon. // Perl Foundation Perl 6 Wiki. The Perl Foundation, 28 February. Посетен на 9 February 2012.
  14. Kuchling, A. M.. Functional Programming HOWTO. // Python v2.7.2 documentation. Python Software Foundation. Посетен на 2014-10-24.
  15. Fogus, Michael. MartinOdersky take(5) toList. // Send More Paramedics. 6 August 2010. Посетен на 9 February 2012.
  16. Lattner, Chris. Chris Lattner's Homepage. // Chris Lattner, 2014-06-03. Посетен на 2014-10-24. 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. https://wiki.haskell.org
  18. http://learnyouahaskell.com/introduction#so-whats-haskell
Криейтив Комънс - Признание - Споделяне на споделеното Лиценз за свободна документация на ГНУ Тази страница частично или изцяло представлява превод на страницата „Haskell_programming_language“ в Уикипедия на английски. Оригиналният текст, както и този превод, са защитени от Лиценза „Криейтив Комънс - Признание - Споделяне на споделеното“, а за съдържание, създадено преди юни 2009 година — от Лиценза за свободна документация на ГНУ. Прегледайте историята на редакциите на оригиналната страница, както и на преводната страница. Вижте източниците на оригиналната статия, състоянието ѝ при превода, и списъка на съавторите.