Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

Samankaltaiset tiedostot
815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Luku 3. Listankäsittelyä. 3.1 Listat

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Laiska laskenta, korekursio ja äärettömyys. TIEA341 Funktio ohjelmointi Syksy 2005

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Ohjelmoinnin peruskurssien laaja oppimäärä

Tämän vuoksi kannattaa ottaa käytännöksi aina kirjoittaa uuden funktion tyyppi näkyviin, ennen kuin alkaa sen määritemää kirjoittamaan.

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 5. marraskuuta 2015

Aliohjelmat. 1 Kutsusekvenssit. Antti-Juhani Kaijanaho 5. helmikuuta 2007

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 13. lokakuuta 2009

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 12. tammikuuta 2012

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 26. lokakuuta 2009

4.2. ALIOHJELMAT 71. Tulosvälitteisyys (call by result) Tulosvälitteinen parametri kopioidaan lopuksi

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Uusi näkökulma. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmoinnin peruskurssien laaja oppimäärä

Scheme-kesäkurssi luento 3

815338A Ohjelmointikielten periaatteet

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Ohjelmoinnin peruskurssien laaja oppimäärä

811120P Diskreetit rakenteet

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmoinnin peruskurssien laaja oppimäärä

kontrollivuon analyysejä optimointiensa tueksi ja myös tiettyjen merkitysopillisten

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Luento 4 Aliohjelmien toteutus

Jakso 4 Aliohjelmien toteutus

Jakso 4 Aliohjelmien toteutus

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

ITKP102 Ohjelmointi 1 (6 op)

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 9. lokakuuta 2016

Geneeriset tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 22. toukokuuta 2013

58131 Tietorakenteet ja algoritmit (syksy 2015)

Ohjelmoinnin peruskurssien laaja oppimäärä

Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005

Luku 5. Monadit. 5.1 Siirrännän ongelma

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Ohjelmoinnin peruskurssien laaja oppimäärä

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

Ohjelmoinnin peruskurssien laaja oppimäärä

Scheme-kesäkurssi luento 4

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

811120P Diskreetit rakenteet

Luento 4 Aliohjelmien toteutus

Ohjelmoinnin peruskurssien laaja oppimäärä

Luento 4 Aliohjelmien toteutus

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Jakso 4 Aliohjelmien toteutus

TAMPEREEN TEKNILLINEN YLIOPISTO

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TAMPEREEN TEKNILLINEN YLIOPISTO

Jakso 4 Aliohjelmien toteutus. Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Tietorakenteet ja algoritmit

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

1. Omat operaatiot 1.1

Luento 4 Aliohjelmien toteutus. Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio

5.5 Jäsenninkombinaattoreista

Ohjelmoinnin peruskurssien laaja oppimäärä

Mitä funktionaalinen ohjelmointi on

TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä

Olio-ohjelmointi Syntaksikokoelma

Mathematica Sekalaista asiaa

Racket ohjelmointia osa 2. Tiina Partanen Lielahden koulu 2014

Monadeja siellä, monadeja täällä... monadeja kaikkialla? TIES341 Funktio ohjelmointi 2 Kevät 2006

ITKP102 Ohjelmointi 1 (6 op)

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Jäsennysalgoritmeja. TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 29. syyskuuta 2009 TIETOTEKNIIKAN LAITOS. Jäsennysalgoritmeja

Algoritmit 2. Luento 14 Ke Timo Männikkö

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

ITKP102 Ohjelmointi 1 (6 op)

jäsennyksestä TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 29. syyskuuta 2016 TIETOTEKNIIKAN LAITOS Kontekstittomien kielioppien

Funktionaalinen ohjelmointi

Monipuolinen esimerkki

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

Luku 4. Tietorakenteet funktio-ohjelmoinnissa. 4.1 Äärelliset kuvaukset

8.5 Takarekursiosta. Sanoimme luvun 8.3 foldl -esimerkissämme että

1.4 Funktioiden kertaluokat

Ohjelmoinnin peruskurssi Y1

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Java kahdessa tunnissa. Jyry Suvilehto

Ohjelmoinnin peruskurssi Y1

Transkriptio:

Jatkeet TIES341 Funktio ohjelmointi 2 Kevät 2006

Havainto: häntäkutsu (1) Funktiokutsun yleinen toimintaperiaate: (koskee vain täysiä kutsuja, ts. jotka eivät palauta funktiota) kutsuja kirjaa pinoon paluuosoitteen kutsuja kirjaa pinoon parametrit kutsuja hyppää kutsuttavaan kutsuttava tekee työnsä kutsuttava poistaa parametrit pinosta kutsuttava laittaa pinoon paluuarvon kutsuttava katsoo pinosta paluuosoitteen ja hyppää siihen

Havainto: häntäkutsu (2) Tapauksessa f x = g (x+1) f:n kutsuja laittaa paluuosoitteen pinoon f:n kutsuja laittaa argumentin pinoon f:n kutsuja hyppää f:ään f laittaa oman paluuosoitteensa pinoon f laskee x+1 ja laittaa tuloksen pinoon f hyppää g:hen... g tekee mitä tekee, jättää pinoon f:n paluuosoitteen ja tuloksen... f poistaa tuloksen pinosta f poistaa paluuosoitteensa pinosta f poistaa x:n pinosta f palauttaa tuloksen pinoon

Havainto: Häntäkutsu (3) f tekee turhaa työtä! f voisi korvata x:n x+1:llä ja hypätä suoraan g:hen g palatessaan antaa f:n kutsujalle suoraan sen paluuarvon, minkä f olisi välittänyt tätä temppua sanotaan häntäkutsun poistoksi hyödyt: rekursiivinen häntäkutsu (ns. häntärekursio) vaatii vain vakiomäärän pinoa, ei tavallisen rekursion vaatimaa lineaarista määrää vähentää turhaa työtä haittana lähinnä debuggausinformaation häviäminen

Häntäkutsun määritelmä Kutsu on häntäkutsu, jos kutsuva funktio ei tee mitään muuta kutsun päätyttyä kuin palaa omaan kutsujaansa olennaisesti f... = g... g:n kutsu on häntäkutsu f... = g (h...) g:n kutsu on häntäkutsu h:n kutsu ei ole häntäkutsu f... = if... then g... else... g:n kutsu on häntäkutsu jne Poistettu häntäkutsu on olennaisesti parametreja

Häntäkutsun tärkeys Jokainen oikea funktiokieli poistaa kaikki häntäkutsut Mahdollistaa monet funktio ohjelmoinnin idiomit: silmukoiden koodaaminen (häntä)rekursiona äärellisten automaattien idiomi: kukin tila on funktio tilasiirtymä on häntäkutsu

Muunnos häntäkutsuksi, osa 1: akkumulaattoriparametri (1) Ykköskurssilla käytettiin välillä akkumulaattoriparametrin ideaa Suht. yleiskäyttöinen malli, jolla funktiokutsun saa muutettua häntäkutsuksi f x p x = r otherwise = g x (f (h x)) ==> f x = f' r x where f' a x p x = a otherwise = f' (g x a) (h x)

Muunnos häntäkutsuksi, osa 1: akkumulaattoriparametri (2) length [] = 0 length (x:xs) = 1 + length xs ==> length xs = f 0 xs where f a [] = a f a (x:xs) = f (1 + a) xs map f [] = [] map f (x:xs) = f x : xs ==> map' f xs = g [] xs where g a [] = a g a (x:xs) = g (f x : a) xs

Muunnos häntäkutsuksi, osa 1: akkumulaattoriparametri (3) Tämä muunnos ei aina säilytä käyttäytymistä x:t tulevat g:lle eri järjestyksessä ei vaikutusta length esimerkissä map esimerkissä tuloslista on käänteinen pitäisi oikeastaan laittaa reverse g:n kutsun ympärille huom! reverse saadaan id :: [a] > [a] funktiosta tällä muunnoksella :) Muunnos ei ole aina hyödyllinen tilaa säästyy vain jos paluuarvon asymptoottinen tilavaativuus on sublineaarinen rekursion syvyyteen nähden laiskan laskennan vallitessa muutos on joskus vahingollinen map toimii äärettömillä listoilla, map' ei

Muunnos häntäkutsuksi, osa 2: Jatkeenvälitys (1) jatkeenvälitys on englanniksi continuation passing style, CPS g :: C -> B h :: A -> C f :: A -> B f x = g (h x) ==> g' :: C -> (B -> R) -> R h' :: A -> (C -> R) -> R f' :: A -> (B -> R) -> R f' x c = h' x $ \hx -> g' hx c

Idea: Muunnos häntäkutsuksi, osa 2: Jatkeenvälitys (2) funktiolle annetaan parametrina jatke : funktio, joka, kun sitä kutsutaan, tekee sen, mitä alkuperäisen funktion palattua pitää tehdä korvataan arvon palauttaminen funktiokutsulla paluuarvo annetaan tuolle funktiolle parametriksi ==> jokainen kutsu on häntäkutsu Ei ole optimointimuunnos kuten akku Käytetään erilaisissa kirjastoissa mm. Haskellin I/O ennen monadiaikaa Jotkut (funktiokielten) kääntäjät perustuvat tähän ks. Andrew Appel: Compiling with continuations, Cambridge

Call/cc (1) Jotkin kääntäjät tekevät ensi töikseen koko ohjelmalle CPS muunnoksen Tästä syntyi idea: annetaan tämä implisiittinen jatke ohjelmoijalle käyttöön call with current continuation eli call/cc: callcc :: ((a > a) > a) > a callcc (\c >...) suorittaa... :n siten, että c:hen sidotaan funktio, jonka kutsuminen aiheuttaa goton callcc:n kutsujaan siten, että callcc näyttäisi palauttaneen c:lle annetun parametrin Ei löydy Haskellista ei hyödyllinen laiskan laskennan kanssa ja sivuvaikutusten

Call/cc (2) call/cc on erittäin voimakas kontrollirakenne call/cc:llä voidaan toteuttaa poikkeusjärjestelmä korutiinit ohjelmoijan sekoaminen ym ym ym