Jatkeet TIES341 Funktio-ohjelmointi 2 Kevät 2006.

Slides:



Advertisements
Samankaltaiset esitykset
esitämme SLIDEPLAYER.FI
Advertisements

LPC LPCC PLP LSP/LSF Matemaattinen kikka Levinson-Durbin algoritmi
© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
Tietorakenteet ja algoritmit
Synkronointi Yksi tärkeimmistä rinnakkaisuuteen liittyvistä asioista. semaforit tapahtumalaskurit monitorit.
AS Automaation signaalinkäsittelymenetelmät
OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT. LUOKKA JAVA ohjelma koostuu luokista LUOKKA sisältää metodeja molemmat sisältävät attribuutteja eli muuttujia.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
KANNANVAIHTO?.
1.2.1 KÄÄNTEISFUNKTIO JA SEN KUVAAJA
Syksy 2001Johdatus bioinformatiikkaan / T. Pasanen 1 7. Monirinnastus Geeni perhe: ryhmä läheisiä toisilleen sukua olevia geenejä, jotka koodaavat samankaltaisia.
Funktion esittely eli prototyyppi tMyn1 Funktion esittely eli prototyyppi Funktion esittely (function declaration) kertoo funktion nimen, parametrien tyypit.
Map-luokka Mikä Map on? Mapin esittely ja luonti Map-luokan metodeja Mappiin lisääminen Mapin läpikäynti Mapista poistaminen 1.
String-vertailusta ja Scannerin käytöstä (1/2)
Neliöjuurifunktion derivaatta (todistus: ks. kirja, s. 39)
Metodit – Arvotyyppi Ellei metodi palauta arvoa, sen arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa pakollinen, vaikka sen käyttö on sallittua.
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
5. Kapselointi Yleistä Kapseloinnilla (encapsulation) tarkoitetaan luokan tietojen ja toimintojen pakkaamista yhdeksi suojatuksi kokonaisuudeksi.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
1 Ohjelmointikielten varhaishistoria Esa-Matti Miettinen
© Jukka Juslin1 Osio2 Olio-ohjelmointi: Merkkijonot eli Stringit Jukka Juslin.
FunktiottMyn1 Funktiot Funktiot voidaan jakaa –Kirjastofunktioihin, jotka ovat valmiina kaikkien käytössä. Erikoisempien kirjastofunktioiden käyttöönotto.
Oman poikkeus- käsittelyfunktion tMyn1 Oman poikkeuskäsittelyfunktion määrittely Funktion tulisi muodostaa ainoastaan sellaisia poikkeuksia, jotka on sallittu.
Tiedon vieminen funktiolle tMyn1 Tiedon vieminen funktiolle, parametrit Argumentin vieminen funktiolle voidaan toteuttaa kahdella menetelmällä: –Pass-by-Value.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
1 Rio s05 / Liisa Marttinen Kertaus: Semaforit Semaforin operaatiot: sem s = n; # semaforin alkuarvo P(s); # jos s
Funktio.
1 Rio / Auvo Häkkinen Kertaus: Semaforit Semaforin operaatiot: sem s = n; # semaforin alkuarvo P(s); # jos s
Tietokannat -kurssi KSAO, Datanomit, käytön tuki kevät 2015 Lauri Tapola.
Listat eli luettelot listaelementit ovat lohkoelementtejä:  lista ja listan alkiot alkavat uudelta riviltä  listan jälkeen tuleva elementti alkaa uudelta.
21. Rekursio.
Ohjausrakenteet Määräävät ohjelmakoodin suoritusjärjestyksen Ehtolause if – else on muotoa if (lauseke) lause1 else lause2 Jos lauseke on tosi, niin suoritetaan.
Funktiot Funktio = mahdollisten syöte- ja tulostearvojen välinen suhde siten, että kuhunkin syötearvoon on liitetty tulostearvo –Funktion laskeminen =
Ohjelmassa tänään Ohjelmointimallit Pseudokieli Modulaarisuus.
Kompleksisuus Yleistä.
Kesätyöntekijöiden kommentteja Opasnetistä ja ydinvoimatyöstä: ”Kun tulin kesätöihin minulla oli vain jokin suuntaa antava aavistus siitä mitä meinattiin.
Monadit TIES341 Funktio-ohjelmointi 2 Kevät 2006.
Aloitusluento TIES341 Funktio-ohjelmointi 2 Kevät 2006.
Abstraktit tietotyypit – jatkoa TIEA341 Funktio-ohjelmointi 1 Syksy 2005.
Lisää laskentoa TIEA341 Funktio-ohjelmointi 1 Syksy 2005.
Uusi näkökulma TIEA341 Funktio-ohjelmointi 1 Syksy 2005.
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli.
Foreign Function Interface Antti Marttila Funktio-ohjelmointi 2.
Taas laskin TIES341 Funktio-ohjelmointi 2 Kevät 2006.
String-vertailusta ja Scannerin käytöstä (1/2)
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op
Tyyppiluokat II ­ konstruktoriluokat, funktionaaliset riippuvuudet ­
5. Kapselointi.
Laiska laskenta, korekursio ja äärettömyys
8. Rekursio.
1. Omat operaatiot.
Monadeja siellä, monadeja täällä... monadeja kaikkialla?
Funktio-ohjelmointi ja Java
TIES341 Funktio-ohjelmointi 2 Kevät 2006
13. Loogiset operaatiot.
TIEA341 Funktio-ohjelmointi 1 Syksy 2005
Kirjoita tähän Kirjoita tähän Kirjoita tähän Kirjoita tähän Kirjoita tähän Kirjoita tähän Kirjoita tähän.
Ryhmä 3 Timo Anttonen, Miro Salo
Vielä laskentoa: kertausta ja täsmennystä
Ohjelmien suunnittelu
2. Lukujonot 2.1. Lukujonon käsite -äärellinen tai ääretön Luettelona:
Laiska laskenta, korekursio ja äärettömyys
4. Attribuutit.
8. Rekursio.
Kokeile uutta Celianetiä testiympäristössä
5. Aliohjelmien toteutus
CLT132 Tehtävät (viikko 5).
13. Loogiset operaatiot.
4. Luokan testaus ja käyttö olion kautta
Jakso 4 Aliohjelmien toteutus
Esityksen 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 – f hyppää kutsujansa paluuosoitteeseen

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 välittävä goto

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

Muunnos häntäkutsuksi, osa 2: Jatkeenvälitys (2) ● Idea: – 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 University Press, 1992

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 puuttuessa

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