A Haskell programozási nyelv

Vezérlési szerkezetek

Alapvető vezérlési szerkezetek

A Haskell funkcionális programozási nyelv, ezért a vezérlés leírása egy kicsit másként történik, mint az imperatív nyelvekben: itt ugyanis a program előrehaladását elsősorban nem a szekvencia, hanem a függvénykompozíció biztosítja.

Case-kifejezések

Az esetszétválasztás szintaxisa a következő:

case [kifejezés] of { eset_1 -> [kifejezés_1]; ... eset_n -> [kifejezés_n] }

A case használatakor nem muszáj minden lehetőséget lefedni, de mintaillesztési hibát kapunk, ha nem definiált esethez érkezik. Átfolyási probléma természetesen nincsen, hiszen egy függvény csak egy értéket kaphat, és ha azt megkapta, a többi esettel már nem foglalkozik.

If ... then ... else

Az if e1 then e2 else e3 konstrukció is létezik (mindig kötelező kirakni a then és else ágat is), de ez csak egy rövidítése az elobbi egy speciális esetének:

case e1 of True -> e2 False -> e3

Az if szerkezetben e1-nek Bool-nak kell lennie, míg e2-nek és e3-nak azonos típusúnak kell lennie.

Őrfeltételek

Az egyik legkényelmesebben használható eszköz az őrfeltétel mintához:

sign x | x > 0 = 1 | x == 0 = 0 | x < 0 = -1

Egy őrfeltételes kifejezés utolsó sorának illik az otherwise kulcsszóval illetett ágat is megadni, ez olyan mint más nyelveknél a other ág. Az utasítás ide kerül, ha egyik őrfeltétel sem volt igaz. Valamint az őrfeltételek elrendezését is úgy kell megadni, hogy a szűkebb igazsághalmazú van elöl és lefelé haladva az egyre bővebb igazsághalmazúak következnek. Hiszen ha az első őrfeltétel egy általános szinte mindig teljesülő feltétel, akkor a többi ágra sosem terelődik az utasítás, így feleslegesek is. Ha az őrfeltételek diszjunkt halmazok, akkor erre nem kell figyelni, valamint ha az őrfeltételek az összes esetet lefedik, akkor az otherwise ágnak nincs értelme.

let-kifejezések

A let kifejezésekkel beágyazott blokkok hozhatók létre, lokális változókkal:

let y = a * b f x = (x + y) / y in f c + f d

A where klózok az őrfeltételek változóira adnak megkötéseket. Ezek a klózok bizonyos értelemben pont ellenkező módon működnek, mint a let kifejezések: nem lokalizálnak, hanem globalizálnak, azaz míg a let maga is kifejezésként értékelődik, s így csak pontosan egy kifejezésre érvényes, a where kulcsszó egy egész definíción belül, viszont annak csak a legkülső szintjén használható.

f x y | y > z = ... | y == z = ... | y < z = ... where z = x * x

Do-kifejezések

Írhatók szekvenciák is, ám ennek az eszköznek a használata nem javasolt, mert idegen a Haskell gondolkodásmódjától. Maga a szekvencia mint programkonstrukciós eszköz nem is része a nyelvnek, definíciója az IO osztályban található.

exp -> do { stmts } stmts -> stmt1 ; ... ; stmtn (n>=0) stmt -> | exp | pat <- exp | let decls

Példa:

do { putStr "x: " ; l <- getLine ; return (words l) }

A listáknál látott halmazszerű felírás is sorolható a vezérlési szerkezetekhez, hiszen a ciklussal azonosítható. Ennek segítségével egy quicksort mindössze ennyi:

quicksort [] = [] quicksort (x:xs) = quicksort [y | y <- xs, y <x] ++ [x] ++ quicksort [y | y - xs, y > =x]