Haskell

From Wikipedia, the free encyclopedia

Haskell
Remove ads

Haskell (Ха̀скъл) е функционален език за програмиране. В частност, той е полиморфично статично-типизиран, „мързелив“ (нищо не се прави, докато не се наложи), чисто функционален език, доста различен от повечето езици за програмиране. Името му е в чест на логика Хаскел Къри, чийто труд в областта на математическата логика е в основата на създаването на функционалните езици. Haskell е базиран на ламбда смятане, следователно ламбда се използва за негово лого.[17] Поради близостта си с математиката и богатството от математически библиотеки езикът е широко използван за решаване на кратки математически задачи.

Бързи факти Парадигма, Реализиране през ...

Haskell се радва на широка общност от потребители, които непрекъснато допринасят нови библиотеки и функционалности. Haskell и SQL повлияват създаването на LINQ (Microsoft .NET Framework).

Remove ads

Компилатор

Най-използваният Haskell компилатор e GHC (The Glasgow Haskell Compiler). GHC e наличен за GNU/Linux, FreeBSD, MacOS, Windows, and Solaris. След като бъде инсталиран, с него се получават ghc и ghci. Първото компилира Haskell приложенията или библиотеки до двоичен код. Второто е интерпретатор, който позволява на разработчика да пише Haskell код и да получава обратна връзка (при грешка) на момента.

Remove ads

История

След излизането на 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“.

Remove ads

Характеристики

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 ]
Remove ads

Особености на езика

Haskell e статично-типизиран език. Когато кодът се компилира, компилаторът знае кое парче код е число, кое string и т.н, поради което множество възможни грешки се улавят още по време на компилация. Пример – ако се пробва събиране на число и string, компилаторът ще алармира, че това не може да се случи. Haskell има система за типово разпознаване (type inference). Това означава, че не е нужно изрично да се обявява от какъв тип данни е дадена променлива. Пример – ако се напише 5 + 4, не е нужно да се казва на компилатора, че това е число, той ще разбере сам. [18]

Remove ads

Външни препратки

Технически доклади
История

Вижте също

Бележки

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads