Haskell
Haskell on standardiseeritud üldotstarbeline puhtalt funktsionaalne programmeerimiskeel. Keel on nimetatud loogiku Haskell Curry järgi.[1] Haskell toetab laiska väärtustamist, mustrisobitust, loendite hõlmamist, tüübiklasse ja tüüpide polümorfismi. Kuna tegemist on puhta funktsionaalse keelega, siis puuduvad Haskelli funktsioonidel kõrvalefektid. Viimaste esitamiseks on eraldi andmetüüp: monaad.[2] Süntaksist üldiseltKommentaari algust tähistavad Haskellis kaks sidekriipsu (--). Näiteks -– Siin on kommentaar Kommentaar võib olla eraldi real või rea lõpus. Sarnaselt Pythonile eraldatakse Haskellis koodiplokke läbi taandamise. Näiteks funktsiooni keha ei tohi olla funktsiooni nimega samal kaugusel ekraani vasakust servast. Kui taanded pole korralikult vormistatud, siis kuvatakse vastavasisuline veateade ning programmi ei saa käivitada. Laisk ja agar väärtustamineHaskellis väärtustatakse kõik avaldised laisalt, mis tähendab, et avaldised väärtustatakse ainult siis, kui nende väärtus on tingimata käesoleval arvutuse sammul oluline. Kui aga avaldise väärtus pole hetkel oluline, siis jäetakse väärtustamata avaldis mällu ja vajadusel väärtustatakse hiljem. Haskellis on olemas ka operaator $! (dollarimärk ja hüüumärk), mis sunnib agaralt väärtustama. Näiteks deklaratsioonis eelnevateSumma n = ($!) eelnevateSumma (n – 1) * n operaator $! sunnib väärtustama avaldist n – 1. Hello worldJärgneb Haskellis kirjutatud programm "Hello world" (kõik read peale viimase võib ära jätta): module Main where main :: IO () main = putStrLn "Hello world!"
LoendidHaskellis on olemas loendid ehk "listid". Tühja loendit tähistab Sõnesid käsitletakse Haskellis ka kui tähemärkide loendeid. Näiteks "Tere, maailm!" on loend, mille elementideks on selles sõnes sisalduvad sümbolid. Loendite hõlmamineHaskell toetab ka loendite hõlmamist (ingl. list comprehension). Näiteks [x ^ 2 | x <- [0, 0.5 .. 3]] Selle tulemusel väljastatakse loend, mille elementideks on arvude 0, 0.5, 1, 1.5, 2, 2.5 ja 3 ruudud. MustrisobitusMuster esitab skeemi, millega ette antud avaldist võrreldakse.[3] Muster esitab vajalikku ehitust. Näiteks, kui oodatav väärtus, mis ette antakse, on mittetühi loend, siis saab näidisega x : xs kontrollida, et etteantavas loendis oleks vähemalt üks element. Kusjuures x tähistab loendi pead ehk esimest elementi ning xs tähistab loendi saba ehk ülejäänud elemente alates teisest elemendist. Näiteks loendi [5] korral, mis on üheelemendiline, on x väärtuseks 5 ja xs väärtuseks []. Kohane näidis ilmestamaks loendi ehituse kontrolli oleks järgnev: ymberPoord xs = let loppu x : xs -- 1) = loppu xs ++ [x] loppu _ -- 2) = [] in loppu xs Protseduur Näidise 1) sobitumisel kutsutakse rekursiivselt välja RekursioonKuna Haskellis puuduvad tsüklid, siis nende asemel tuleb kasutada rekursiooni, sageli koos mustrisobitusega. Ebaõnnestunud arvutuse märgiks on nn bottom, mida tähistatakse tagurpidi T-tähega (⊥). Bottom tekib programmi täitmisaegse vea või lõpmatu arvutuse korral. Kuna see võib juhtuda mistahes funktsiooni puhul, on bottom osa igast tüübist.[4] Avaldiste liigidLet-avaldisLet avaldis võimaldab defineerida hulga lisamuutujaid protseduuri sees. Näiteks tehe x = let ruut = x * x veerand = x / 4 in ruut + veerand See funktsioon tagastab etteantud argumendi veerandi ja ruudu summa. Let-avaldise puhul on olulised võtmesõnad let ja in ning pärast võtmesõna in peab järgnema avaldis. LambdaavaldisLambdaavaldis on näiteks järgnev: viieKordne = \ x -> 5 * x See võtab argumendiks arvu ning tagastab selle arvu viiekordsena. Näiteks, kui argumendiks on 6, tagastab see lambdaavaldis arvu 30. Interaktiivses keskkonnas jõuab sama tulemuseni sisestades (\ x -> 5 * x) 6 Lambdaavaldist alustav kaldkriips sarnaneb kreeka tähestiku tähe lambdaga – sellest tõenäoliselt ka nimi "lambdaavaldis". ValikuavaldisValikuavaldis võrdleb argumenti suurema hulga etteantud näidistega ning neist sobiva leidmisel täidab selle näidise kohta käivad käsud ning järgmiseid näidiseid enam ei võrdle. faktoriaal n = case compare n 0 of GT -> ($!) faktoriaal (n - 1) * n EQ -> 1 _ -> error "Argument peab olema mittenegatiivne!" Olulised võtmesõnad on case ja of. Argumendiks antud arvu võrreldakse nulliga ( Sisend ja väljundHaskellis on ka vahendid standardväljundist lugemiseks ning sinna kirjutamiseks. Illustreerimiseks toome järgneva näite: dialoog = do putStr "Sisesta palun oma nimi: " nimi <- getLine putStrLn ("Tere, " ++ nimi ++ ". Meeldiv tutvuda!") See funktsioon küsib kasutajalt nime ning tervitab teda seejärel viisakalt nimepidi. Kasutatud on selle funktsiooni koostamisel do-süntaksit, mis võimaldab kirjeldada mitmeid tegevusi järjest. Viited
|