Curry stiil ja fun. osaline rakendamine

Seotud dokumendid
Infix Operaatorid I Infix operaatorid (näiteks +) ja tüübid (näiteks ->) kirjutatakse argumentide vahele, mitte argumentide ette. Näiteks: 5 + 2, 2*pi

Funktsionaalne Programmeerimine

Scala ülevaade 1 Meetodid, muutujad ja väärtused. Süntaks 2 Lihtsad tüübid ja väärtused. 3 OOP, case-klassid ja mustrisobitus. 4 Puhta Scala väärtusta

loeng2

Funktsionaalne Programmeerimine

PHP

Matemaatiline analüüs IV 1 3. Mitme muutuja funktsioonide diferentseerimine 1. Mitme muutuja funktsiooni osatuletised Üleminekul ühe muutuja funktsioo

Pealkiri

1 / loeng Tekstitöötlus Sisend/väljund Teksti lugemine Sõnad

I Generaatori mõiste (Java) 1. Variantide läbivaatamine Generaator (ehk generaator-klass) on klass, milles leidub (vähemalt) isendimeetod next(). Kons

Andmeturve

Excel Valemite koostamine (HARJUTUS 3) Selles peatükis vaatame millistest osadest koosnevad valemid ning kuidas panna need Excelis kirja nii, et

Programmeerimiskeel APL Raivo Laanemets 17. mai a.

loeng7.key

Failiotsing: find paljude võimalustega otsingukäsk find kataloog tingimused kataloog - otsitakse sellest kataloogist ja tema alamkataloogidest tingimu

Relatsiooniline andmebaaside teooria II. 6. Loeng

Word Pro - diskmatTUND.lwp

Praks 1

Andmed arvuti mälus Bitid ja baidid

Polünoomi juured Juure definitsioon ja Bézout teoreem Vaadelgem polünoomi kus K on mingi korpus. f = a 0 x n + a 1 x n a n 1 x

Pealkiri

Operatsioonisüsteemide ehitus

HAJUSSÜSTEEMID HAJUSSÜSTEEMID Kaugprotseduurid IDL kompileerimine ONCIDLnäide CORBAIDLnäide MIDLnäide DCERPCmuidomadusi XML-RPC JSON-RPC REST document

TARTU ÜLIKOOL MATEMAATIKA-INFORMAATIKATEADUSKOND Arvutiteaduse instituut Infotehnoloogia eriala Roman Jagomägis Programmeerimiskeel privaatsust säilit

SQL

Microsoft Word - Errata_Andmebaaside_projekteerimine_2013_06

vv05lah.dvi

lcs05-l3.dvi

CSS juhend

Microsoft Word - 56ylesanded1415_lõppvoor

lvk04lah.dvi

Diskreetne matemaatika I Kevad 2019 Loengukonspekt Lektor: Valdis Laan 20. juuni a.

19. Marek Kolk, Kõrgem matemaatika, Tartu Ülikool, Arvridade koonduvustunnused Sisukord 19 Arvridade koonduvustunnused Vahelduvat

Microsoft PowerPoint - loeng2.pptx

IMO 2000 Eesti võistkonna valikvõistlus Tartus, aprillil a. Ülesannete lahendused Esimene päev 1. Olgu vaadeldavad arvud a 1, a 2, a 3,

VKE definitsioon

Print\A4\QualifyReduced.pmt

Microsoft Word - ref - Romet Piho - Tutorial D.doc

ITI Loogika arvutiteaduses

Pintsli otsade juurde tegemine Esiteks Looge pilt suurusega 64x64 ja tema taustaks olgu läbipaistev kiht (Transparent). Teiseks Minge kihtide (Layers)

E-arvete juhend

ITI Loogika arvutiteaduses

Tartu Ülikool

GRUPI-SMS Veebirakenduse kasutamise juhend Rakendus Elisa grupi-smsi rakendus Väljaandja Elisa Eesti AS Juhendi koostamise kuupäev Versioon

SQL

G aiasoft Programmi VERP ja Omniva Arvekeskuse liidese häälestamine ja arvete saatmine-lugemine VERP 6.3 ja VERP 6.3E Versioon ja hilisemad K

Microsoft Word - Keypad-controller-manual-new_1.docx

Tõlkija poolne märkus: Ma leidsin 2 kohta, kus oli selle mustri parandusi üleval. Esimene neist ametlik VK koduleht. Sealt leitud täiendused ei ole õi

Image segmentation

Pythoni Turtle moodul ja Scratchi värvilisem pool Plaan Isikukoodi kontrollnumbri leidmine vaatame üle lahenduse kontrollnumbri leimiseks. Pythoni joo

Sissejuhatus Informaatikasse Margus Niitsoo

SAF 7 demo paigaldus. 1.Eeldused SAF 7 demo vajab 32- või 64-bitist Windows 7, Window 8, Windows 10, Windows Server 2008 R2, Windows Server 2012, Wind

8.klass 4 tundi nädalas, kokku 140 tundi Hulkliikmed ( 45 tundi) Õppesisu Hulkliige. Hulkliikmete liitmine ja lahutamine ning korrutamine ja jagamine

Microsoft PowerPoint - Loeng2www.ppt [Compatibility Mode]

Microsoft Word - essee_CVE ___KASVANDIK_MARKKO.docx

VL1_praks2_2009s

prakt8.dvi

Õppematerjalide esitamine Moodle is (alustajatele) seminar sarjas Lõunatund e-õppega 12. septembril 2017 õppedisainerid Ly Sõõrd (LT valdkond) ja Dian

PowerPointi esitlus

MTAT Operatsioonisüsteemid - Turvalisus

VL1_praks6_2010k

1. AKE Ajalise keerukuse empiiriline hindamine

Peafail3_2.dvi

X Window System tuntud kui: X11 X X-Windows akendussüsteem/akendesüsteem rastergraafikat toetavatele ekraanidele UNIX-maailmas väga levinud mitmesugus

PowerPointi esitlus

MTAT Operatsioonisüsteemid - Turvalisus

Algoritmid ja andmestruktuurid

KASUTUSJUHEND

TARTU ÜLIKOOL Arvutiteaduse instituut Informaatika õppekava Mirjam Iher Nõrgima eeltingimuse staatiline analüüs pinukeeltele Bakalaureusetöö (9 EAP) J

DIGITAALTEHNIKA DIGITAALTEHNIKA Arvusüsteemid Kümnendsüsteem Kahendsüsteem Kaheksandsüsteem Kuueteistkü

Print\A4\QualifyReduced.pmt

Hoia oma arvuti turvaline ja kiire 1.Leia start nupust alustades Juhtpaneel 2.Juhtpaneeli aadressiribalt leia Kõik juhtpaneeli üksused 3.Avanenud tööa

Mining Meaningful Patterns

Järelevalvetasutegurite kogumise eesmärgil kasutatavate varade koguväärtuse ja koguriskipositsiooni vormide täitmise juhised

PÄRNU TÄISKASVANUTE GÜMNAASIUM ESITLUSE KOOSTAMISE JUHEND Pärnu 2019

Matemaatiline analüüs III 1 4. Diferentseeruvad funktsioonid 1. Diferentseeruvus antud punktis. Olgu funktsiooni f : D R määramispiirkond D R selles p

Innar Liiv, Juhataja, Vertical ANDMELADUDE KASUTAMISEST LADUDES Innar Liiv Juhataja, Vertical

(loeng3-ohtlikud_koodiloigud)

10/12/2018 Riigieksamite statistika 2017 Riigieksamite statistika 2017 Selgitused N - eksaminandide arv; Keskmine - tulemuste aritmeetiline keskmine (

Juhend nutiterminali seadistamiseks ja kaardimaksete vastuvõtmiseks Ingenico Link/2500 ja icmp

Pangalingi spetsifikatsioon Pocopay pangalingilt makse algatamiseks tuleb kasutada teenust Kaupmees teeb päringu Pocopayle aadressile

Materjalid koostas ja kursuse viib läbi Tartu Ülikooli arvutiteaduse instituudi programmeerimise õpetamise töörühm 2.1 Muutujad SISSEJUHATUS Programmi

Mida me teame? Margus Niitsoo

BIM360 ja RealityCapture

HAJUSSÜSTEEMID HAJUSSÜSTEEMID Veebiteenused ja SOAP Web Services Web Services SOAP WSDL Ühilduvus UDDI Kihiline arhitektuur masinsuhtluse jaoks erinev

AWK Aho Weinberger Kernighan struktuurse teksti töötlemise keel rikkalikult tekstitöötlusvahendeid omal alal suhteliselt lihtne ja kiiresti realiseeri

Ruutvormid Denitsioon 1. P n Ütleme, et avaldis i;j=1 a ijx i x j ; kus a ij = a ji ; a ij 2 K ja K on korpus, on ruutvorm üle korpuse K muutujate x 1

Abiarstide tagasiside 2016 Küsimustikule vastas 137 tudengit, kellest 81 (60%) olid V kursuse ning 56 (40%) VI kursuse tudengid. Abiarstina olid vasta

Microsoft Word - EVS-EN _ pdfMachine from Broadgun Software, a great PDF writer utility!

G OSA A VARIANT RESPONDENDILE ISE TÄITMISEKS

(Estonian) DM-RBCS Edasimüüja juhend MAANTEE MTB Rändamine City Touring/ Comfort Bike URBAN SPORT E-BIKE Kasseti ketiratas CS-HG400-9 CS-HG50-8

Kom igang med Scratch

EFEXON LIUGUKSED 2015 €URO.xls

Microsoft Word - Vx610 EMV KASUTUSJUHEND.doc

Praks 1

Väljavõte:

Curry stiil ja fun. osaline rakendamine Selle asemel, et kirjutada uusfunktsioon x y z = olemasolevfunktsioon (x+1) y z tuleks Haskellis kirjuldada uusfunktsioon x = olemasolevfunktsioon (x+1) Pane Tähele: funktsioon olemasolevfunktsioon on osaliselt rakendatud. Mõlemad funktsioonid võtavad (vähemalt!) kolm argumenti. Realistlikum näide: f xs = sum (takewhile (/=0) xs) või siis f = sum. takewhile (/=0) Soovitus: Kirjuta funktsioone nii, et neid oleks võimalik ka osaliselt rakendada. Funktsiooni (a,b) -> c karritatud (currytud) kuju on a -> b -> c. Saab viia ka liiga kaugele: max3 :: Int -> Int -> Int -> Int max3 = (. max). ((.). max) Kalmer Apinis Programmeerimiskeeled Sügis 2017

2 Haskelli tüübisüsteem Haskelli on staatiliselt tüübitud, tugevalt tüübitud, tüübituletusega programmeerimiskeel. staatiliselt tüübitud tüübid teada kompileerimise ajal tugevalt tüübitud garantii, et väärtused on just seda tüüpi, millega nad end esitavad tüüpe ei teisendata automaatselt. (nagu C-s int -> float) S.t. rohkem eeltööd, et tüübivead eemaldada. Programm on aga siis töökindlam. tüübituletus enamasti kirjutatakse tüüpe ainult selleks, et kontrollida, kas kompilaator saab programmist samamoodi aru nagu programmeerija.

3 Tüübid Baastüübid Int, Integer, Char, Double, Float, Bool Funktsiooni tüüp Int -> Char, Float -> Float, Int -> (Char -> Int) Tüübimuutujad algavad väiketähega ja tähistavad ükskõik millist konkreetset tüüpi. (polümorfism, i.k. polymorfism) a -> a, [a] -> Int, [a] -> [a] Parameetriline polymorfism: Haskellis ei saa polymorfne funktsioon teha kindlaks, mis konkreetne tüüp tüübimuutujal parajasti on. S.t. funktsioon on defineeritud olenemata konkreetset tüübist. Mis funktsioonid võivad olla tüüpidega a -> a, [a] -> Int või [a] -> [a]? Loe lisaks: RWH, peatükk 2, lk 17..27

4 Uute tüüpide loomine Uusi tüüpe saab luua kolmel viisil: data e. uue algebralise andmetüübi loomine, type e. tüübi sünonüümi loomine ja newtype e. olemasolevale tüübile uue ja eristatava nime tegemine. Näiteks sõned on Haskellis tähtede järejendi sünonüüm! type String = [Char] S.t. Tähtede listid on sõned ja sõned on tähtede listid! [ a, X, 8 ] :: String "Tere" :: [Char] Olemasolvast tüübist saab teha uue! newtype Sõne = TeeSõne String Nüüd saame kasutada konstruktorit TeeSõne :: String -> Sõne, s.t. TeeSõne "Tere" :: Sõne

5 Algebralised andmetüübid Tõeväärtuste tüüp Bool on defineeritud järgnevalt: data Bool = True False Sellest koodireast loeme välja järgnevat: defineeritakse uus andmetüüp Bool; defineeritakse konstruktor True :: Bool; defineeritakse konstruktor False :: Bool. Hiljem saab mustrisobitusega vaadata, millise konstruktoriga väärtus loodi: f True =... f False =...

6 Algebraliste andmetüüpide defineerimine data UusTüüp a b = Konstr1 Int Konstr2 a Char b Konstr3 Ehk siis: defineeritakse uued andmetüübid UusTüüp a b; näiteks UusTüüp Int Int, UusTüüp Char (UusTüüp Char Int); defineeritakse konstruktor Konstr1 :: Int -> UusTüüp a b; defineeritakse konstruktor Konstr2 :: a -> Char -> b -> UusTüüp a b; defineeritakse konstruktor Konstr3 :: UusTüüp a b; Mustrisobitus: f Konstr3 =... f (Konstr1 x) =... f (Konstr2 x y z) =...

7 Näide pindala: type Radius = Float type Width = Float type Height = Float data Shape = Circle Radius Rect Width Height deriving Show area :: Shape -> Float area (Circle r) = pi * r^2 area (Rect w h) = w * h puud: data Tree a = Empty Branch a (Tree a) (Tree a) deriving Show flatten :: Tree a -> [a] flatten Empty = [] flatten (Branch x t1 t2) = flatten t1 ++ [x] ++ flatten t2

8 Näide: Listid Listide tüübiperet võime ette kujutada järgnevalt: data [a] = [] a : [a] Ehk siis: Iga tüübi a jaoks eksisteerib list [a]; tühja listi konstruktor [] :: [a]; mittetühja listi konstruktor (:) :: a -> [a] -> [a];

9 Näide: nurjumisvõimalusega funktsioonid Tüübipere Maybe on defineeritud järgnevalt: data Maybe a = Nothing Just a Listist otsimise funktsioon: lookup x [] = Nothing lookup x ((y,z):ys) x==y = Just z otherwise = lookup x ys Näiteks: lookup 4 [(3, x ),(4, y )] == Just y lookup 2 [(3, x ),(4, y )] == Nothing Tähelepanekud: Maybe a väärtusi on ühe võrra rohkem kui a väärtusi Loe lisaks: RWH, peatükk 2, lk 41..55..

10 Kirjetüüp Selle mustri asemel data Raamat = Raamat String -- pealkiri [String] -- autorid Int -- aasta pealkiri (Raamat p ) = p autorid (Raamat _ as _) = as aasta (Raamat a) = a lisaautor :: Raamat -> String -> Raamat lisaautor (Raamat p as a) x = Raamat p (x:as) a saab Haskellis kirjutada ka nii data Raamat = Raamat { pealkiri :: String autorid :: [String] aasta :: Int } lisaautor raamat x = raamat { autorid = x : autorid r }

11 Aritmeetilised jadad aseq1 = [1..5] [1, 2, 3, 4, 5] aseq2 = [0,2..10] [0, 2, 4, 6, 8, 10] aseq3 = [0,2..11] [0, 2, 4, 6, 8, 10] aseq4 = [5..1] [] aseq5 = [10,7..(-3)] [10, 7, 4, 1, -2] aseq6 = [1..] [1, 2, 3, 4, 5, 6, 7,... lõpmatu list! aseq7 = [ A.. Z ] "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

12 Listikomprehensioon lcex1 = [x*x x <- [1..5]] [1, 4, 9, 16, 25] Terminoloogia: x <- [1..5] on "generaator" lcex2 = [x*x x <- [1..10], even x] [4, 16, 36, 64, 100] Terminoloogia: even x on "valvur" lcex3 = [i (i,c) <- zip [1..] "HaSKell", isupper c] [1, 3, 4] lcex4 = [(x,y) x <- [1..2], y <- [1..3]] [(1,1), (1,2), (1,3),(2,1), (2,2), (2,3)] lcex5 = [(x,y) y <- [1..3], x <- [1..2]] [(1,1), (2,1), (1,2),(2,2), (1,3), (2,3)] NB! Parempoolne generaator muutub vasakpoolsest kiiremini! lcex6 = [(x,y) x <- [1..4], y <- [x+1..4]] [(1,2), (1,3), (1,4),(2,3), (2,4), (3,4)]

13 Tüübiklassid I Haskellis tuleb tihti kirjutada funktsioone, mis erinevad ainult natuke tüübi poolest: equalchar :: Char -> Char -> Bool equalint :: Int -> Int -> Bool equalstring :: String -> String -> Bool Sellist koodi ei saa kirjutada parameetrilise polymorfse funktsiooniga, kuna funktsioonide implementatsioon on erinev: equal :: a -> a -> Bool equal =??? -- pole def. mis töötaks iga tüübi korral Selleks ongi loodud tüübiklassid class Equal a where equal :: a -> a -> Bool instance Equal Char where equal =... -- :: Char -> Char -> Bool instance Equal Int where equal =... -- :: Int -> Int -> Bool...

14 Tüübiklassid II Haskelli standardteegis on defineeritud tüübiklass Eq: class Eq a where (==), (/=) :: a -> a -> Bool -- Minimaalne definitioon peab sisaldama: -- (==) või (/=) x /= y = not (x == y) -- vaikedefinitsioon x == y = not (x /= y) -- vaikedefinitsioon Võrldusoperaatori tüüp on: (==) :: Eq a => a -> a -> Bool s.t me saame operaatorit kasutada, kui tema argumentitüübil on defineeritud Eq instants! Kõikidel polymorfsetel funktsioonidel, mis kasutavad võrdust peab tüübi kontekst olema Eq: lookup :: Eq a => a -> [(a, b)] -> Maybe b

15 Tüübiklasside automaatne defineerimine Osade tüübiklasside definitsioonid on keerukamad, kui tundub, et nad peaks olema class Read a where readsprec :: Int -> ReadS a readlist :: ReadS [a] GHC.Read.readPrec :: Text.ParserCombinators.ReadPrec.ReadPrec a GHC.Read.readListPrec :: Text.ParserCombinators.ReadPrec.ReadPrec [a] class Show a where showsprec :: Int -> a -> ShowS show :: a -> String showlist :: [a] -> ShowS... kuigi, neid tüübiklasse kasutatakse suuresti ainult kahe funktsiooni jaoks: read :: Read a => String -> a show :: Show a => a -> String -- parsib väärtuse sõnest -- muudab väärtuse sõneks Standardteegi tüübiklasse nagu Eq, Show, Read, Ord, Enum saab lasta defineerida automaatselt. Näiteks: data Loom = Kass Koer Muu String Loe lisaks: RWH, peatükk 6 deriving (Show, Eq)