1
Sissejuhatus
1 Funktsionaalse programmeerimise paradigma 2
Funktsionaalse programmeerimiseparadigma
1 Funktsionaalse programmeerimise paradigma
1.1 Programmeerimise paradigmad
3
Programmeerimise paradigmad
1 Funktsionaalse programmeerimise paradigma
1.1 Programmeerimise paradigmad
4
Lai jaotus
• Imperatiivne programmeerimine.
• Deklaratiivne programmeerimine.
– Funktsionaalne programmeerimine.
– Loogiline programmeerimine.
1 Funktsionaalse programmeerimise paradigma
1.1 Programmeerimise paradigmad
5
Imperatiivne vs deklaratiivne paradigma
• Imperatiivne programm sätestab otseselt arvutuse sammsammulisekäigu.
Imperatiivne programm on käskude jada.
• Deklaratiivne programm kirjeldab otseselt hoopis matemaatilisi ob-jekte ja abstraktseid seoseid nende vahel.
Programm on deklaratsioonide kogum.
1 Funktsionaalse programmeerimise paradigma
1.1 Programmeerimise paradigmad
6
Imperatiivne vs deklaratiivne paradigma
• Imperatiivse programmi mõte selgub arvutusprotsessi detailidest.
• Deklaratiivse programmi mõtte tabamiseks pole arvutusprotsessidetailidesse vaja süveneda.
Paradigma Programmimõte
Arvutusedetailid
Imperatiivne kaudne otseneDeklaratiivne otsene kaudne
1 Funktsionaalse programmeerimise paradigma
1.1 Programmeerimise paradigmad
7
Arvutus deklaratiivses paradigmas
Programmi tekst ei peegelda vahetult täitmisaegset tegevust.
– Arvutusprotsess tuleneb koodist kõigi programmide jaoks min-gil ühtsel sisseehitatud viisil.
– Programmeerija peab oskama arvutusprotsessi detailidega prog-rammeerimisel arvestada.
∗ Pole kasu koodist, mis kirjeldab abstraktselt õiget asja,kuid arvutab kauem kui oodata jaksame.
1 Funktsionaalse programmeerimise paradigma
1.2 Funktsionaalse programmeerimise eritunnused
8
Funktsionaalse programmeerimiseeritunnused
1 Funktsionaalse programmeerimise paradigma
1.2 Funktsionaalse programmeerimise eritunnused
9
Eritunnuste loetelu
• Funktsioonid, samuti protseduurid ja struktuurid, on käsitletavad kuitavalised andmed.
• Arvutus põhineb avaldiste väärtustamisel.
• Kehtib nn ilmutatud viidatavus.
1 Funktsionaalse programmeerimise paradigma
1.2 Funktsionaalse programmeerimise eritunnused
10
Funktsioonid on andmed
Funktsioone, protseduure, struktuure saab kasutada võrdsel alusel ta-valiste andmetega.
– Avaldise väärtus võib olla funktsioon.
– Iga funktsioon võib olla omakorda funktsiooni argumendiks jafunktsiooni väärtuseks, samuti andmestruktuuri komponendiks.
1 Funktsionaalse programmeerimise paradigma
1.2 Funktsionaalse programmeerimise eritunnused
11
Suur väljendusvõimsus
Funktsioonide käsitamine tavaliste andmetena suurendavad oluliseltvõimalusi asju lühidalt väljendada.
– Tegevusi on võimalik programmeerida parameetrilisena teistetegevuste suhtes.
∗ Nt funktsioon, mis antud järjendi iga elemendiga teeb an-tud tegevust. (Ei pea iga tegevuse jaoks eraldi defineerima.)
– Uusi funktsioone on võimalik koostada jooksvalt kohapeal.
∗ Nt liitmisest saame ühe argumendi fikseerimisel funktsioo-ni, mis liidab oma argumendile selle arvu.
1 Funktsionaalse programmeerimise paradigma
1.2 Funktsionaalse programmeerimise eritunnused
12
Avaldiste väärtustamine
Arvutuses on kesksel kohal avaldiste väärtustamine —
avaldise teisendamine eesmärgiga saada infot tema väärtusekohta.
Andmedeklaratsioonid programmis kujutavad endast sisuliselt avaldis-te teisendusreeglite loetelu.
1 Funktsionaalse programmeerimise paradigma
1.2 Funktsionaalse programmeerimise eritunnused
13
Ilmutatud viidatavus kui kõrvalefektide puudumine
Ilmutatud viidatavus —
tingimus, mille kohaselt avaldise väärtuse määravad ainuüksi te-ma (päris)alamavaldiste väärtused.
Kõrvalefekt —
nähtus, kus avaldise väärtustamine toob kaasa väärtustuskesk-konna seisu muutuse (nt muudab mõne muutuja väärtust).
Ilmutatud viidatavus tähendab teisi sõnu kõrvalefektide puudumist.
1 Funktsionaalse programmeerimise paradigma
1.2 Funktsionaalse programmeerimise eritunnused
14
Ilmutatud viidatavuse järeldused
• Alamavaldist võib alati asendada sama väärtusega avaldisega.
– Matemaatikas on sarnane alusprintsiip — võrdse asendamiselvõrdsega saame võrdsed.
– Filosoofias on sarnane nn Leibnizi seadus.
• Funktsioon määrab alati matemaatilise funktsiooni —
eeskirja, mis seab igale võimalikule argumendile vastavusse täp-selt ühe väärtuse.
Funktsioon ei samastu oma definitsiooniga.
1 Funktsionaalse programmeerimise paradigma
1.2 Funktsionaalse programmeerimise eritunnused
15
Ilmutatud viidatavuse järeldused
• Muutuja väärtust ühe ja sama skoobi (tähendusulatuse, nähtavuspiir-konna) sees muuta ei saa.
– Paralleel matemaatikaga: valemis võivad muutujad küll omadasuvalisi väärtusi, kuid konkreetse muutuja kõigi esinemiste tähen-dus valemi ühe lugemise ajal on sama.
• Sama avaldis sama skoobi samal lugemisel on alati sama väärtusega.
– Ka välise maailma sündmused ei muuda avaldiste väärtust.
1 Funktsionaalse programmeerimise paradigma
1.2 Funktsionaalse programmeerimise eritunnused
16
Ilmutatud viidatavuse järeldused
• Puudub omistamine.
– Arvutuse vahetulemuste salvestamine tuleb realiseerida, algväär-tustades nendega uusi muutujaid (nt funktsiooni parameetreid).
• Puuduvad tsüklid.
– Tsüklilised protsessid tuleb realiseerida rekursiooniga.
1 Funktsionaalse programmeerimise paradigma
1.3 Lisatunnused, mis omased eelkõige funktsionaalsele paradigmale
17
Lisatunnused, mis omased eelkõigefunktsionaalsele paradigmale
1 Funktsionaalse programmeerimise paradigma
1.3 Lisatunnused, mis omased eelkõige funktsionaalsele paradigmale
18
Lisatunnuste nimekiri
• Tugev staatiline tuletusega tüübisüsteem.
• Laisk väärtustamine.
1 Funktsionaalse programmeerimise paradigma
1.3 Lisatunnused, mis omased eelkõige funktsionaalsele paradigmale
19
Staatiline vs dünaamiline tüüpimine
Staatiline tüüpimine tähendab, et tüübid määratakse kindlaks jubaprogrammi kompileerimise ajal.
– Võimaldab kompileerimisel rohkem vigu avastada, täitmisele lä-hevad kvaliteetsemad programmid.
– Võimaldab kompileerimisel erineva kujuga andmeid ära tundaja mälu reserveerida vastavalt vajadusele.
Dünaamilise tüüpimise puhul tegeldakse tüüpide väljaselgitamisegaprogrammi täitmise ajal.
1 Funktsionaalse programmeerimise paradigma
1.3 Lisatunnused, mis omased eelkõige funktsionaalsele paradigmale
20
Tugev vs nõrk tüüpimine
Tugev tüüpimine tähendab, et andmete kasutamine tüübilt sobimatulviisil arvutuse käigus on täiesti välistatud.
– Ei lase juhtuda olukorral, kus programm sooritab tüübivigaseoperatsiooni ilma veast teatamata.
Vastandub nõrk tüüpimine.
1 Funktsionaalse programmeerimise paradigma
1.3 Lisatunnused, mis omased eelkõige funktsionaalsele paradigmale
21
Tuletusega vs kontrolliga tüübisüsteem
Tüübituletus tähendab tüüpide automaatset tuletamist konteksti põh-jal, kui programmeerija pole tüüpe deklareerinud.
Tüübikontroll tähendab programmeerija poolt deklareeritud tüüpidekooskõlalisuse automaatset kontrollimist.
1 Funktsionaalse programmeerimise paradigma
1.3 Lisatunnused, mis omased eelkõige funktsionaalsele paradigmale
22
Laisk väärtustamine
Laisk väärtustamine on väärtustamine vastavalt vajadusele.
– Kui funktsiooni väärtuse leidmisel argumenti vaja ei lähe, siisargument jääb väärtustamata.
Struktuurset argumenti väärtustatakse ainult määral, mil seda onfunktsiooni väärtuse leidmiseks vaja.
Agar väärtustamine tähendab, et funktsiooni väärtuse leidmisel arvu-tatakse alati kõigepealt argument välja.
1 Funktsionaalse programmeerimise paradigma
1.3 Lisatunnused, mis omased eelkõige funktsionaalsele paradigmale
23
Väärtustamise järjekorrad
Väärtustamise järjekord vastab tippude töötlemise järjestusele avaldisepuu läbimisel.
– Agaral väärtustamisel võrdub funktsioonide väljakutsete järjes-tus neile vastavate tippude lõppjärjestusega.
– Laisal väärtustamisel on funktsioonide väljakutsete järgnevussarnane eesjärjestusega, aga harude järjestus valitakse vajadus-põhiselt ja mittevajalikud harud jäetakse vahele.
1 Funktsionaalse programmeerimise paradigma
1.4 Funktsionaalse programmeerimise eelised ja puudused
24
Funktsionaalse programmeerimise eelised japuudused
1 Funktsionaalse programmeerimise paradigma
1.4 Funktsionaalse programmeerimise eelised ja puudused
25
Eelis 1
• Programmid suhteliselt kergesti loetavad.
– Ei pea arvutuse detailidesse süüvima.
– Programmid on ülevaatlikud ja suhteliselt lühikesed.
1 Funktsionaalse programmeerimise paradigma
1.4 Funktsionaalse programmeerimise eelised ja puudused
26
Eelis 2
• Esmaversioonide, prototüüpide programmeerimine lihtne ja kiire.
(Võib ära tasuda, isegi kui põhiversioon kirjutatakse muus keeles.)
– Vähe tüütut detailide kirjapanekut.
– Võimalik suhteliselt kiiresti palju realisatsioonivariante läbi proo-vida ja võrrelda.
– Kõrgemat järku funktsioonid võimaldavad programmeerida sar-naseid tegevusi ühekorraga sama koodijupiga.
1 Funktsionaalse programmeerimise paradigma
1.4 Funktsionaalse programmeerimise eelised ja puudused
27
Eelis 3
• Elementaarseid asju tegema (nt kalkulaatorina kasutama) õppiminelihtne.
– Notatsioon (süntaks ja selle mõistmine) on lähedane matemaatikakeele põhimõtetele, tulenevalt ilmutatud viidatavusest ja avaldistekesksest rollist.
– Eeldefineeritud kõrgemat järku funktsioonid võimaldavad pärispalju huvitavat ära teha.
1 Funktsionaalse programmeerimise paradigma
1.4 Funktsionaalse programmeerimise eelised ja puudused
28
Eelis 4
• Programmi korrektsuse tõestamine suhteliselt lihtne.
– Detailid ei sega.
– Programmi kirjapanek funktsionaalse keele notatsioonis teeb suu-re sammu vajalikus suunas ära.
1 Funktsionaalse programmeerimise paradigma
1.4 Funktsionaalse programmeerimise eelised ja puudused
29
Puudus 1
• Nõuab palju ressurssi, nii aega kui mälu.
– Palju andmete kopeerimist ilmutatud viidatavuse tõttu.
– Funktsionaalne arvutusmasin, avaldiste väärtustaja, on põhimõt-telt keerukam kui imperatiivne käsutäitmismasin.
– Laisk väärtustamine tekitab mällu pikki väärtustamata avaldisi.
1 Funktsionaalse programmeerimise paradigma
1.4 Funktsionaalse programmeerimise eelised ja puudused
30
Puudus 2
• Mõned ülesandetüübid raskesti programmeeritavad.
– Interaktsioon välismaailmaga, sisend-väljund.
– Sündmuspõhised algoritmid.
– Otsene mäluhaldus.
1 Funktsionaalse programmeerimise paradigma
1.4 Funktsionaalse programmeerimise eelised ja puudused
31
Puudus 3
• Heaks programmeerijaks saamine suhteliselt raske.
– Vaja avaldiste väärtustaja keerulist “hingeelu” tunda.
– Vaja matemaatilist mõtlemist.
2 Haskelli maailm 32
Haskelli maailm
2 Haskelli maailm 33
Haskell
Haskell on keel, mille peal toimub käesolevas kursuses praktilineõpe.
– Kehtiv uus standard on Haskell 2010.
– Eelmine oli Haskell 98.
– . . .
Mõtteviis on eri versioonides praktiliselt sama või erineb vaid vähe-märgatavais detailides.
2 Haskelli maailm
2.0 Funktsionaalse programmeerimise eelised ja puudused
34
Puhtalt funktsionaalne keel
Keel on puhtalt funktsionaalne, kui temas ei saagi teisiti kui funkt-sionaalselt programmeerida.
Standard-Haskell on puhtalt funktsionaalne.
2 Haskelli maailm 35
Programmielementide tähendus
Haskellis on neli põhilist tähenduskategooriat:
– andmed,
– tüübid,
– liigid,
– klassid.
Eri kategooriad omavahel ei lõiku.
2 Haskelli maailm 36
Klassifitseerimisvahekorrad
Kolme viimase tähenduskategooria objektid klassifitseerivad teiste tä-henduskategooriate objekte:
– tüübid klassifitseerivad andmeid,
– liigid klassifitseerivad tüüpe,
– klassid klassifitseerivad samuti tüüpe.
2 Haskelli maailm
2.1 Andmed ja tüübid
37
Andmed ja tüübid
2 Haskelli maailm
2.1 Andmed ja tüübid
38
Üldist
Tüübid klassifitseerivad andmeid.
– Igas tüübis on peale normaalsete andmete veel ⊥—
nn bottom, mis tähistab normaalsel kujul info täielikkupuudumist, arvutuse ebaõnnestumist.
Ebaõnnestumine võib tekkida
∗ täitmisaegsest veast;
∗ lõpmatust arvutusest, mis kunagi midagi välja ei anna.
– Ükski anne ei kuulu mitmesse tüüpi.
2 Haskelli maailm
2.1 Andmed ja tüübid
39
Loetelutüübid
Loetelutüüp on tüüp, mis sisaldab ainult üksikandmeid.
– Int — lühikeste (4-baidiste) täisarvude tüüp.
– Integer — suvapikkusega täisarvude tüüp.
– Float ja Double — ujukomaarvutüübid.
– Char — (teksti)sümbolitüüp.
2 Haskelli maailm
2.1 Andmed ja tüübid
40
Veel loetelutüüpe
“Tõelised” loetelutüübid (defineeritud andmete loetlemisega).
– Bool — tõeväärtusetüüp.
∗ Andmed False ja True.
– Ordering — suurusvahekorratüüp.
∗ Andmed LT, EQ, GT,tähistavad vastavalt vahekordi “väiksem”, “niisama suur”,“suurem”.
– . . . .
2 Haskelli maailm
2.1 Andmed ja tüübid
41
Struktuuritüübid
Struktuuritüüp sisaldab andmestruktuure, vastandudes loetelutüü-pidele.
– Listitüübid.
– Nurjumisega tüübid.
– Järjenditüübid ehk korrutistüübid.
– Summatüübid.
2 Haskelli maailm
2.1 Andmed ja tüübid
42
Listid
Listid on tähtsaimad andmestruktuurid funktsionaalses programmee-rimises.
– List on üht tüüpi andmete joru.
∗ Listi paigutatud andmeid nimetatakse tema elementi-deks.
– Iga tüübi A jaoks on oma listitüüp ListA, mis sisaldab liste ele-mentidega tüübist A.
2 Haskelli maailm
2.1 Andmed ja tüübid
43
Listi ehitus
List (mis pole ⊥) tüübist ListA võib olla
– tühi — [],
– mittetühi — kujul x : l, kus
∗ x on listi esimene element, anne tüübist A,
∗ l on listi ülejäänud elementide list samas järjekorras, oma-korda tüübist ListA.
Mittetühjas listis x : l on x nn listi pea ja l listi saba.
2 Haskelli maailm
2.1 Andmed ja tüübid
44
Lõplikud, lõpmatud, osalised listid
Mis saab, kui listi algusest elemente järjest minema visata?
– Lõpliku listiga alustades jõuame lõpliku arvu sammudega tühjalistini.
– Lõpmatu listiga alustades jääb mistahes lõpliku arvu sammudejärel järele mittetühi (täpsemalt, omakorda lõpmatu) list.
– Osalise listiga alustades jõuame lõpliku arvu sammudega (lis-titüübi) bottomini.
2 Haskelli maailm
2.1 Andmed ja tüübid
45
Sõned
Sõned on sümbolite listid:
– tühi sümbolite list on tühi sõne;
– mittetühja sümbolite listi
∗ pea on sõne esimene sümbol ja
∗ saba on sõne osa teisest sümbolist lõpuni.
2 Haskelli maailm
2.1 Andmed ja tüübid
46
Nurjumisega tüübid
Nurjumisega tüübid võimaldavad arvutuse ebaõnnestumist kujutadanormaalse väärtusena.
– Iga tüübi A jaoks on üks nurjumisega tüüp MaybeA.
– Iga (bottomist erinev) anne tüübist MaybeA võib olla
∗ nurjumine — Nothing,
∗ kujul Justx, kus x on anne tüübist A.
2 Haskelli maailm
2.1 Andmed ja tüübid
47
Järjenditüübid
Erinevalt listidest on järjendid
– kindla komponentide arvuga,
– komponentide tüübid on üksteisest sõltumatud ja võivad erineda(ehkki on järjenditüübiga määratud).
2 Haskelli maailm
2.1 Andmed ja tüübid
48
Paarid
Tähtsaimad järjendid on kahe komponendiga paarid.
– Mistahes tüüpide A, B jaoks on olemas paaritüüp A×B.
– Iga (bottomist erinev) paar tüübist A×B on kujul (x, y), kus
x on anne tüübist A ja
y on anne tüübist B.
2 Haskelli maailm
2.1 Andmed ja tüübid
49
Funktsioonid
Funktsioonid saavad mingeid objekte argumendiks ja annavad igaargumendi jaoks mingi talle vastava objekti väärtuseks.
– Funktsiooni f väärtust argumendil x tähistatakse
järjestkirjutusega f x.
– Argumendi andmist funktsioonile nimetatakse
funktsiooni rakendamiseks argumendile.
– Funktsioonid ei ole andmestruktuurid ega üksikandmed.
2 Haskelli maailm
2.1 Andmed ja tüübid
50
Funktsioonitüübid
Funktsioonid jagunevad funktsioonitüüpidesse.
– Mistahes tüüpide A ja B jaoks on olemas funktsioonitüüpA→B.
– Tüüp A→ B sisaldab funktsioonid, mis
võtavad argumente tüübist A ja
annavad väärtusi tüübist B.
2 Haskelli maailm
2.1 Andmed ja tüübid
51
Mitme argumendiga funktsioonid
Mitme argumendiga funktsioone võib esitada
– funktsioonina, mille argumenditüüp on järjenditüüp,
– funktsioonina, mille väärtusetüüp on funktsioonitüüp.
2 Haskelli maailm
2.1 Andmed ja tüübid
52
Karritamine
Mitme argumendiga funktsiooni üleviimist esimest kujust teise nime-tatakse karritamiseks.
– Kui funktsiooni tüüp on A1 × . . . × Al → B, siis karritamiselsaame funktsiooni tüüpi A1 → . . .→ Al → B.
– Vahe on vaid vormiline: karritatud funktsioon annab sama tule-muse samadel argumentidel, kuid võtab argumente mitte järjen-dis koos, vaid ükshaaval.
2 Haskelli maailm
2.1 Andmed ja tüübid
53
Kõrgemat järku funktsioonid
Kõrgemat järku funktsioon on selline, mis võtab funktsiooni argu-mendiks.
2 Haskelli maailm
2.1 Andmed ja tüübid
54
Järk
Teine võimalus defineerida on täpsustada järgu mõistet.
– 0. järku funktsioon on objekt, mis ei sisalda funktsioone.
– Kui n on positiivne, siis n. järku funktsiooniks nimetataksefunktsiooni, mille
∗ iga võimalik argument sisaldab vaid n-st madalamat järkufunktsioone ja
∗ iga võimalik väljaantav väärtus sisaldab vaid ülimalt n. jär-ku funktsioone.
Kõrgemat järku funktsioon on funktsioon, mille järk on suurem kui 1.
2 Haskelli maailm
2.1 Andmed ja tüübid
55
Agarad ja laisad funktsioonid
Funktsiooni f nimetatakse agaraks, kui f ⊥ = ⊥.
Vastasel korral nimetatakse teda laisaks.
2 Haskelli maailm
2.1 Andmed ja tüübid
56
Protseduuritüübid
Eraldi protseduuritüübid eristavad keskkonnast mõjutatud andmetegamanipuleerimisi keskkonnast mõjutamata andmetest.
– Iga tüübi A jaoks leidub protseduuritüüp IOA.
– Protseduur tüüpi IOA edastab oma töö lõpul andme tüübist A,mis võib olla keskkonnast mõjutatud.
Uut keskkonnast mõjutatud annet saavad kasutada ainult järgne-vad protseduurid.
2 Haskelli maailm
2.1 Andmed ja tüübid
57
Ekstensionaalsus
Matemaatikas kehtib ekstensionaalsus:
– kui funktsioonidel f , g on ühised argumendid ja iga argumendix korral f x = g x, siis f = g;
– kui paaridel p, q on vastavad komponendid võrdsed, siis p = q;
– . . .
2 Haskelli maailm
2.1 Andmed ja tüübid
58
Ekstensionaalsus Haskellis
Haskellis kehtib ekstensionaalsus seni, kui ⊥ pole asjasse segatud.
– Funktsioonitüübi ⊥ annab suvalisele argumendile rakendadesvälja (väärtusetüübi) ⊥, kuid seda teeb ka konstantne “päris”funktsioon.
– Paaritüübi ⊥ komponendid on bottomid, kuid sama kehtib ka“päris” paari (⊥ ,⊥) puhul.
– . . .
2 Haskelli maailm
2.2 Tüübid ja liigid
59
Tüübid ja liigid
2 Haskelli maailm
2.2 Tüübid ja liigid
60
Tüübid laiemalt
Tüüp tähendab laiemalt mitte ainult andmekogumit, vaid ka funkt-siooni, mis tüüpidele seab vastavusse tüüpe.
– List (ilma argumendita) on tüüp — seab igale andmekoguminamõeldud tüübile A vastavusse tüübi ListA.
– Analoogselt Maybe ja IO on laiemas mõttes tüübid.
– . . .
2 Haskelli maailm
2.2 Tüübid ja liigid
61
Üldist
Liigid klassifitseerivad tüüpe nende olemuse järgi.
– Andmekogumid on liiki ∗.
– Mistahes liikide K ja L korral on olemas liik K → L.
K → L sisaldab tüübifunktsioonid, mis võtavad argumendikstüüpe liigist K ja annavad välja tüüpe liigist L.
Iga tüüp kuulub ainult ühte liiki.
2 Haskelli maailm
2.2 Tüübid ja liigid
62
Tuttavate tüüpide liigid
• Nt Int, Integer, Float, Double, Bool, Ordering on kõik liiki ∗.
• Nt List, Maybe, IO on liiki ∗ → ∗.
– Kuid iga tüübi A korral liigist ∗ kujutavad ListA, MaybeA, IOAendast tüüpe liigist ∗.
2 Haskelli maailm
2.3 Tüübid ja klassid
63
Tüübid ja klassid
2 Haskelli maailm
2.3 Tüübid ja klassid
64
Üldist
Klassid klassifitseerivad tüüpe programmeerija suva järgi.
– Oluline on teatavate muutujate (nn klassi meetodite) defineeritustüübi jaoks.
– Samma klassi kuuluvad tüübid peavad olema sama liiki.
– Sama tüüp võib kuuluda mitmesse klassi.
2 Haskelli maailm
2.3 Tüübid ja klassid
65
Eeldefineeritud klassid
• Eq sisaldab tüübid, mille andmetel saab kontrollida võrdust.
– Funktsioonide ja protseduuride võrdus vaikimisi defineerimata.
– Struktuuridel võrdus vaikimisi komponenthaaval (eeldusel, etkomponenditüübid kuuluvad klassi Eq).
• Ord sisaldab tüübid, mille andmetel saab kontrollida järjestust (nõu-tav ühtlasi kuuluvus klassi Eq).
– Struktuuridel järjestus vaikimisi leksikograafiline (eeldusel, etkomponenditüübid kuuluvad klassi Ord).
2 Haskelli maailm
2.3 Tüübid ja klassid
66
Eeldefineeritud klassid
• Show sisaldab tüübid, mille andmeid saab sõnena esitada.
– Funktsioonid ja protseduurid ei ole vaikimisi esitatavad.
– Struktuurid esituvad vaikimisi (eeldusel, et komponenditüübidkuuluvad klassi Show).
• Read sisaldab tüübid, mille andmeid saab sõnekujust sisse lugeda.
– Sarnased kitsendused klassiga Show.
2 Haskelli maailm
2.3 Tüübid ja klassid
67
Eeldefineeritud klassid
• Num sisaldab arvulised tüübid (nõutav ühtlasi kuuluvus klassidesseEq ja Show).
• Integral, Fractional, Floating on Num alamklassid ja hõlmavadvastavalt täisarvutüübid, murdarvutüübid ja ujukomaarvutüübid.
• Enum sisaldab tüübid, mille andmed on kodeeritavad täisarvudega.
– Nt täisarvud ise, tõeväärtused, suurusvahekorrad, sümbolid.
• Bounded sisaldab tüübid, kus on olemas vähim ja suurim.
– Nt lühikeste täisarvude tüüp, tõeväärtusetüüp, suurusvahekorra-tüüp, sümbolitüüp.