Haskell (tsz. Haskells)
A Haskell egy deklaratív, tisztán funkcionális programozási nyelv, amelyet főként akadémiai és kutatási célokra fejlesztettek ki, de gyakorlati alkalmazásokban is megtalálható (pl. pénzügyi rendszerekben, fordítóprogramokban, eszközláncokban).
Haskell célja: modern, elegáns, matematikailag megalapozott programozási modell biztosítása.
A funkcionális programozásban a függvények az elsőrendű polgárok:
Haskellben minden kifejezés értéket ad vissza. Nem “utasításokat” írunk, hanem kifejezésekből építjük fel a programot.
double x = x * 2
main = print (double 5)
-- Kimenet: 10
double
egy függvény.main
a program belépési pontja.print
kiír a standard kimenetre.
square x = x * x
A square 4
mindig 16-ot ad vissza.
A Haskell lustán kiértékelő nyelv:
take 5
-- Eredmény:
egy végtelen lista, de a
take
csak az első 5 elemet kérdezi le → a többit sosem értékeljük ki.
Haskellben minden kifejezésnek van típusa.
square :: Int -> Int
square x = x * x
A ::
jelzi a típust:
Int -> Int
jelentése: Int
típusú bemenet → Int
típusú eredmény.
double x = x * 2
Itt nem írtunk ki típust, de a fordító kitalálja, hogy Num a => a -> a
.
factorial 0 = 1
factorial n = n * factorial (n - 1)
Itt a factorial
függvény több definícióval rendelkezik → a bemenet mintája alapján választ.
Haskellben a rekurzió a ciklusok alternatívája, mivel nincs hagyományos for
vagy while
.
sumList = 0
sumList (x:xs) = x + sumList xs
) → eredmény 0.(x:xs)
szintaktika: fej és farok.
]
-- Eredmény:
Olvasata: “x vegyen fel értékeket az listából, és ezek négyzetét gyűjtsük össze”.
Szűrőfeltétellel:
, even x]
-- Eredmény:
A függvények is paraméterként átadhatók más függvényeknek.
map square
-- Eredmény:
A map
függvény minden listaelemre alkalmazza a square
függvényt.
Névtelen, inline definiált függvény:
map (\x -> x + 1)
-- Eredmény:
\x -> x + 1
egy lambda.
Minden függvény egy paramétert fogad, és ha több paraméter van, részleges alkalmazás történik:
add x y = x + y
add5 = add 5
add5 3
-- Eredmény: 8
Az add 5
egy új függvény, ami 5-höz ad egy számot.
Monádok olyan szerkezetek, amelyek lehetővé teszik:
IO
, Maybe
, Either
, List
.
main = do
putStrLn "Add meg a neved:"
name <- getLine
putStrLn ("Hello, " ++ name ++ "!")
A do
blokk lehetővé teszi a szekvenciális műveletek írását.
Null biztonságos műveletekhez használható.
safeDiv _ 0 = Nothing
safeDiv x y = Just (x `div` y)
Használat:
case safeDiv 10 2 of
Nothing -> putStrLn "Hiba!"
Just result -> print result
Polimorf viselkedést adnak típusoknak.
Példa:
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
Minden Eq
típusú dologhoz definiálni kell ==
és /=
.
Beépített példák:
Eq
→ egyenlőségOrd
→ rendezésShow
→ sztringgé alakításRead
→ sztringből olvasásNum
→ számok műveletei
A lustaság miatt akár végtelen listák is használhatók:
naturals =
take 10 naturals
-- Eredmény:
✅ Erősen típusos → kevés runtime hiba ✅ Lustaság → hatékony memóriahasználat, végtelen szerkezetek ✅ Rövid, kifejező kód ✅ Magas szintű absztrakciók ✅ Könnyű párhuzamosítás
⚠️ Tanulási görbe → eltér az imperatív gondolkodástól ⚠️ Nincs annyi ipari támogatás, mint pl. C++, Java esetén ⚠️ A monádok megértése kezdetben nehéz lehet
A Haskell nem mainstream, de rendkívül erős és elegáns nyelv, amely:
Alkalmazási területek: