Langbahn Team – Weltmeisterschaft

Haskell

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

1990[1]

Paradygmat

funkcyjny

Typowanie

statyczne, silne, inferencja typów

Implementacje

Glasgow Haskell Compiler

Aktualna wersja stabilna

Haskell 2010[2]

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)[potrzebny przypis].

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 [1..n]

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 = [ a | a <- xs, a <  x ]
          more = [ a | a <- xs, a >= x ]

-- lista liczb pierwszych
primes = map head $ iterate (\(x:xs) -> [ y | y<-xs, y 'mod' x /= 0 ]) [2..]

-- 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). [dostęp 2015-12-12]. (ang.).

Linki zewnętrzne