Haskell
Haskell to funkcyjny język programowania nazwany na cześć Haskella Curry. Jego specyficzne cechy to m.in. leniwe wartościowanie, monady, statyczny polimorfizm, klasy typów, definiowalne operatory (również możliwość tworzenia nowych), strażnicy, wbudowane wsparcie dla literate programming.
Pliki Haskella mają rozszerzenie .hs
Choć semantyka leniwej ewaluacji może być w pewnych zastosowaniach niewygodna, podobnie jak brak biblioteki porównywalnej z ocamlowską (warto jednak zwrócić uwagę na dość pokaźną liczbę bibliotek zewnętrznych), Haskell nadrabia to wyjątkowo czytelną składnią. W szczególności widać na tym polu kontrast wobec języków takich jak Ocaml czy LISP.
Kilka przykładów:
-- Komentarz
silnia 1 = 1
silnia n = n*silnia(n-1)
silnia2 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
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))
-- wyrażenia TreeOfMath mają postać: (Sub (Mult (Leaf 5) (Leaf 4)) (Add (Leaf 3) (Leaf 2)))
[edytuj] Linki zewnętrzne
|
|||||||||||||||||||||||||||||
