Haskell
Wygląd
Logo języka | |
Pojawienie się |
1990[1] |
---|---|
Paradygmat | |
Typowanie | |
Implementacje | |
Aktualna wersja stabilna |
Haskell 2010[2] |
Platforma sprzętowa | |
Strona internetowa |
Haskell – czysto funkcyjny język programowania nazwany na cześć amerykańskiego matematyka, Haskella Curry’ego.
Cechy
[edytuj | edytuj kod]Jego specyficzne cechy to m.in.:
- leniwe wartościowanie (ang. lazy evaluation),
- wsparcie syntaktyczne monad,
- statyczny polimorfizm,
- klasy typów (ang. typeclasses),
- definiowalne operatory (również możliwość tworzenia nowych),
- strażnicy,
- wbudowana obsługa literate programming.
Rozszerzenia
[edytuj | edytuj kod]Pliki Haskella mają rozszerzenie
hs
lhs
gdy zawierają kod w stylu literate programming.
Kompilator
[edytuj | edytuj kod]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
[edytuj | edytuj kod]-- 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
[edytuj | edytuj kod]- ↑ Paul Hudak, John Hughes, Simon Peyton Jones, Philip Wadler: A History of Haskell: Being Lazy with Class. 2007. ISBN 978-1-59593-766-7.
- ↑ Simon Marlow: Announcing Haskell 2010. Haskell (lista dyskusyjna). [dostęp 2015-12-12]. (ang.).
Linki zewnętrzne
[edytuj | edytuj kod]Kontrola autorytatywna (czysto funkcyjny język programowania):