Haskell

W dzisiejszym świecie Haskell zyskał niespotykane dotąd znaczenie. Niezależnie od tego, czy chodzi o technologię, politykę, rozrywkę czy jakąkolwiek inną dziedzinę, Haskell stał się stałym tematem rozmów i niewyczerpanym źródłem zainteresowań i debat. Jego wpływ sięga od decyzji, które podejmujemy w życiu codziennym, po wielkie przemiany, których jesteśmy świadkami na całym świecie. W tym artykule szczegółowo zbadamy wszystkie aspekty Haskell, odkrywając zarówno jego praktyczne implikacje, jak i jego symboliczne znaczenie. Poprzez wyczerpującą analizę postaramy się rzucić światło na różne aspekty, które sprawiają, że Haskell jest zjawiskiem godnym analizy i badania.

Haskell
Logo języka Haskell
Logo języka
Pojawienie się

1990

Paradygmat

funkcyjny

Typowanie

statyczne, silne, inferencja typów

Implementacje

Glasgow Haskell Compiler

Aktualna wersja stabilna

Haskell 2010

Platforma sprzętowa

wieloplatformowy

Strona internetowa

Haskell – czysto funkcyjny język programowania nazwany na cześć amerykańskiego matematyka, Haskella Curry’ego.

Cechy

Jego specyficzne cechy to m.in.:

Rozszerzenia

Pliki Haskella mają rozszerzenie

Kompilator

Haskell był początkowo intensywnie rozwijany wokół ośrodka University of Glasgow, popularny kompilator tego języka to Glasgow Haskell Compiler (GHC) kompilujący szybki kod maszynowy porównywalny w szybkości wykonania do kodów z GCC (ok. 1,3 razy wolniejszy niż C).

Przykłady

-- Komentarz w jednej linijce
{- Komentarze na
wiele linijek 
  {- można zagnieżdżać -}
-}

-- Przykłady funkcji z dopasowywaniem wzorca
silnia 0 = 1
silnia n = n*silnia(n-1)

silnia n = product 

fib 0 = 0
fib 1 = 1
fib n = fib(n-1) + fib(n-2)

ack(0,y) = y+1
ack(x,0) = ack(x-1,1)
ack(x,y) = ack(x-1,ack(x,y-1))

-- przykład użycia strażników
sign x | x > 0 = 1
       | x == 0  =  0
       | x <  0  = -1

myproduct  = 1
myproduct (n:m) = n * myproduct m

mysum  = 0
mysum (n:m) = n + mysum m

-- wyrażenia TreeOfMath mają postać: (Sub (Mult (Leaf 5) (Leaf 4)) (Add (Leaf 3) (Leaf 2)))
data TreeOfMath =
    Mult TreeOfMath TreeOfMath |
    Div  TreeOfMath TreeOfMath |
    Add  TreeOfMath TreeOfMath |
    Sub  TreeOfMath TreeOfMath |
    Leaf Float

compute (Mult x y) = compute x * compute y
compute (Div x y) = compute x / compute y
compute (Add x y) = compute x + compute y
compute (Sub x y) = compute x - compute y
compute (Leaf x) = x

showme (Mult x y) = "(" ++ showme x ++ "*" ++ showme y ++ ")"
showme (Div x y) = "(" ++ showme x ++ "/" ++ showme y ++ ")"
showme (Add x y) = "(" ++ showme x ++ "+" ++ showme y ++ ")"
showme (Sub x y) = "(" ++ showme x ++ "-" ++ showme y ++ ")"
showme (Leaf x) = show x

qsort  = 
qsort (x:xs) = qsort less ++ x:(qsort more)
    where less = 
          more = 

-- lista liczb pierwszych
primes = map head $ iterate (\(x:xs) -> ) 

-- lista liczb Fibonacciego
listFib = 1:1:(zipWith (+) listFib (tail listFib))

Przypisy

  1. Paul Hudak, John Hughes, Simon Peyton Jones, Philip Wadler: A History of Haskell: Being Lazy with Class. 2007. ISBN 978-1-59593-766-7.
  2. Simon Marlow: Announcing Haskell 2010. Haskell (lista dyskusyjna). . (ang.).

Linki zewnętrzne