Movatterモバイル変換


[0]ホーム

URL:


Mine sisu juurde
Vikipeedia
Otsing

Haskell

Allikas: Vikipeedia
See artikkelootabkeeletoimetamist.(Veebruar 2018)
Kui oskad, siis palun aitaartiklit keeleliselt parandada.(Kuidas ja millal see märkus eemaldada?)
Haskell
Faililaiend.hs, .lhs
Paradigmafunktsionaalne, mitterange, modulaarne
Väljalaskeaeg1990
LoojaSimon Peyton Jones,Paul Hudak,Philip Wadler ja teised
Viimane väljalase5.10.1 (22. august2009)
Tüüpiminestaatiline,tugev,tuletatud
ImplementatsioonidGHC, Hugs, NHC, JHC, Yhc
DialektidHelium, Gofer
Mõjutatud keeltestLisp jaScheme,ISWIM,FP,APL,Hope jaHope+,SISAL,Miranda,ML jaStandard ML,Lazy ML,Orwell,Alfl,Id,Ponder
Mõjutanud keeliAgda,Bluespec,Clojure,C#,CAL,Cat,Cayenne,Clean,Curry,Epigram,Escher,F#,Factor,Isabelle,Java Generics,LINQ,Mercury,Omega,Perl 6,Python,Qi,Scala,Timber,Visual Basic 9.0
OSmitmeplatvormiline
Veebilehthaskell.org

Haskell on standardiseeritud üldotstarbeline puhtaltfunktsionaalneprogrammeerimiskeel. Keel on nimetatud loogikuHaskell Curry järgi.[1]

Haskell toetablaiska väärtustamist,mustrisobitust,loendite hõlmamist, tüübiklasse jatüü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 üldiselt

[muuda |muuda lähteteksti]

Kommentaari algust tähistavad Haskellis kakssidekriipsu (--). Näiteks

-– Siin on kommentaar

Kommentaar võib olla eraldi real või rea lõpus.

SarnaseltPythonile eraldatakse Haskellis koodiplokke läbitaandamise. 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äärtustamine

[muuda |muuda lähteteksti]

Haskellis väärtustatakse kõik avaldisedlaisalt, 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 jahüüumärk), mis sunnib agaralt väärtustama. Näiteks deklaratsioonis

eelnevateSumma n  = ($!) eelnevateSumma (n – 1) * n

operaator$! sunnib väärtustama avaldistn – 1.

Hello world

[muuda |muuda lähteteksti]

Jä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!"

module Main where on programmi päis. See sisaldab võtmesõnamodule, protseduuri nimeMain ja võtmesõnawhere. Ridamain :: IO () määrab funktsioonimain tüübi, mis antud juhul on tüübilevoid vastav protseduuritüüp (IO määrab selle, et tegemist on protseduuritüübiga). KäskputStrLn on lühend väljendist "put String Line", mis sisuliselt tähendab, et väljastataksesõne, millele järgneb reavahetus. Sarnane käsk onputStr, kuid sel juhul jäetakse lõpust ära reavahetus.

Loendid

[muuda |muuda lähteteksti]

Haskellis on olemas loendid ehk "listid". Tühja loendit tähistab[] (nurksulud). Loendi võib moodustada näiteks sisestades[1, 2, 3, 4], mille tulemusel luuakse loend elementidega 1, 2, 3 ja 4. Sama loendi moodustamiseks võib kasutada ka konstruktsiooni1 : 2 : 3 : 4 : [], kus elemendid on ühendatudkoolonitega ja viimane on tühja loendi tähis, mis märgib listi lõppu. Seda loendit saab moodustada ka aritmeetilise jada abil: [1 .. 4], kus 1 tähistab esimest elementi ja 4 viimast elementi ning jada samm on vaikimisi 1.

Sõnesid käsitletakse Haskellis ka kuitähemärkide loendeid. Näiteks "Tere, maailm!" on loend, mille elementideks on sellessõnes sisalduvad sümbolid.

Loendite hõlmamine

[muuda |muuda lähteteksti]

Haskell toetab kaloendite 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 3ruudud.x ^ 2 on avaldis jax <- [0, 0.5 .. 3] on generaator. Generaatori parem pool peab alati olema loenditüüpi – näites sisuliselt loend [0, 0.5, 1, 1.5, 2, 2.5, 3].

Mustrisobitus

[muuda |muuda lähteteksti]

Muster 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äidisegax : xs kontrollida, et etteantavas loendis oleks vähemalt üks element. Kusjuuresx tähistab loendi pead ehk esimest elementi ningxs tähistab loendi saba ehk ülejäänud elemente alates teisest elemendist. Näiteks loendi [5] korral, mis on üheelemendiline, onx väärtuseks 5 jaxs 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

ProtseduurymberPoord saab argumendina ette loendi. Kutsutakse väljaloppu argumendiks saadud loendil. Kuna onloppu on defineeritud kaks korda (1) ja2)), siis valitakse näidiste sobitamise teel õige. Esimene näidis1) sobitub mittetühjade loenditega. Teine näidis2) on ainult alakriips ehk jokker, millega sobituvad kõik ette antavad loendid. Näiteks tühja loendi korral sobitamine näidisega1) ebaõnnestub, järelikult täidetakse kood, mis järgneb näidisele2).

Näidise1) sobitumisel kutsutakse rekursiivselt väljaloppu argumendiks olnud loendi sabale, kusjuures argumendiks olnud loendi pea eraldatakse ja lisatakse lõppu. Rekursiivsed pöördumised toimuvad, kuni argumendiks antakse mittetühi loend. Tühja loendi korral väljastatakse algne (protseduurileymberPoord argumendina ette antud) loend.

Kuna Haskellis puuduvad tsüklid, siis nende asemel tuleb kasutada rekursiooni, sageli koos mustrisobitusega.

Ebaõnnestunud arvutuse märgiks on nnbottom, 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, onbottom osa igast tüübist.[4]

Avaldiste liigid

[muuda |muuda lähteteksti]

Let 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 jaruudu summa.Let-avaldise puhul on olulised võtmesõnadlet jain ning pärast võtmesõnain peab järgnema avaldis.

Lambdaavaldis

[muuda |muuda lähteteksti]

Lambdaavaldis 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 alustavkaldkriips sarnaneb kreeka tähestiku tähe lambdaga – sellest tõenäoliselt ka nimi "lambdaavaldis".

Valikuavaldis

[muuda |muuda lähteteksti]

Valikuavaldis 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 oncase jaof. Argumendiks antud arvu võrreldakse nulliga (compare 0 n). Kuin on nullist suurem, siis kutsutakse rekursiivselt sama funktsiooni uuesti välja ühe võrra väiksemal argumendil. Kuin on nulliga võrdne, siis tagastatakse arv 1. Kui argument on negatiivne, siis kuvatakse veateade ("Argument peab olema mittenegatiivne!").

Sisend ja väljund

[muuda |muuda lähteteksti]

Haskellis on ka vahendidstandardvä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 koostamiseldo-süntaksit, mis võimaldab kirjeldada mitmeid tegevusi järjest.

Viited

[muuda |muuda lähteteksti]
  1. Haskell Wiki: Introduction
  2. Haskell Wiki: Monad
  3. "Funktsionaalprogrammeerimine - Kursused - Arvutiteaduse instituut".courses.cs.ut.ee. Vaadatud 4. jaanuaril 2024.
  4. "Bottom - HaskellWiki".wiki.haskell.org. 16. juuni 2014. Originaaliarhiivikoopia seisuga 29. august 2023. Vaadatud 4. jaanuaril 2024.
Pärit leheküljelt "https://et.wikipedia.org/w/index.php?title=Haskell&oldid=6941986"
Kategooria:
Peidetud kategooriad:

[8]ページ先頭

©2009-2026 Movatter.jp