Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Laiska laskenta, korekursio ja äärettömyys

Samankaltaiset esitykset


Esitys aiheesta: "Laiska laskenta, korekursio ja äärettömyys"— Esityksen transkriptio:

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

2 Muistatko graafinsievennyksen?

3 DAG-esitys ja graafinsievennys
Lausekkeen rakennepuu, jos- sa yhteiset alilausekkeet on samastettu Graafinsievennys Sievennetään DAG-esitystä tavalliseen tapaan, mutta korvataan lopuksi DAG:ssa sievennetyn alilausekkeen “juurisolmu” vastauksen juuri- solmulla * 2 + x = 2 * 2 x * (2 + x)

4 * 2 + x = 2 * 2 x * (2 + x) Redeksi

5 * 4 * (2 + 4) + 4 2 Redeksi

6 * 4 * 6 6 4 Redeksi

7 24 24

8 Laiska laskenta Laiska laskenta on toinen nimitys graafinsievennykselle Ytimekkäästi: mitään ei lasketa ennen kuin on pakko, ja mitään ei lasketa kahdesti mutta tämä on yksinkertaistus “Mitään ei lasketa ennen kuin on pakko” normaalijärjestys “Mitään ei lasketa kahdesti” viittaa DAG-esityksen ominaisuuteen, jossa yhteiset alilausekkeet samastetaan ei pidä ottaa liian kirjaimellisesti

9 Tarvevälitys Toinen näkökulma laiskaan laskentaan
Arvovälitys (call by value, innokas laskenta): funktion argumentit lasketaan ennen funktiokutsua parametrit saavat laskennan tulokset arvoikseen Nimivälitys (call by name): funktion argumentti lasketaan joka kerta, kun vastaavaa parametria käytetään funktion sisällä Tarvevälitys (call by need, laiska laskenta): kuten nimivälitys, paitsi että argumentin arvo muistetaan, kun se on kerran laskettu

10 Äärettömät listat nats Cons map succ succ n = n + 1
map f li = case li of Nil -> Nil Cons x xs -> Cons (f x) (map f xs) nats = Cons 0 (map succ nats) nats Cons map succ

11 nats Cons Cons map succ succ succ n = n + 1 map f li = case li of
Nil -> Nil Cons x xs -> Cons (f x) (map f xs) nats = Cons 0 (Cons (succ 0) (map succ )) nats Cons Cons map succ succ

12 nats Cons Cons map 1 succ succ n = n + 1 map f li = case li of
Nil -> Nil Cons x xs -> Cons (f x) (map f xs) nats = Cons 0 (Cons 1 (map succ )) nats Cons Cons map 1 succ

13 Äärettömät listat Lista, joka ei koskaan pääty: Cons _ (Cons _ ( ...
ei Niliä missään Haskellissa _ : _ : _ : ..., ei [] missään Listaa avataan vain sen verran kuin sitä tarvitaan muistissa on yleensä vain koko listan “likiarvo” likiarvon lopussa on Nilin ([]) tilalla ohje siitä, miten lisää alkioita voidaan laskea “thunk” tai “lupaus”

14 Solmun solmiminen Tietyt äärettömät tietorakenteet on mahdollista kirjoittaa niin, että ne vievät aina vain vakiomäärän muistia Idea: “väärinkäytetään” DAG-esityksen ominaisuutta, jossa samastetaan yhteiset alilausekkeet lausekkeesta tulee oma alilausekkeensa ei ole enää syklitön (“DAG”) graafinsievennys toimii silti Esim. ones = 1 : ones

15 Eräs Haskellin kirjastofunktio
Tehtoton! Ei solmun solmintaa! (“Naivi toteutus”) cycle li = li ++ cycle li cycle li = xs where xs = li ++ xs Solmu solmittu: tehokas! (Näin se toteutetaan oikeasti.)

16 Solmun solminnasta Solmu solmiutuu, jos:
tietorakenteen itseviittaus kulkee vakiomäärittelyn kautta voi olla paikallinenkin vakio Funktio voi palauttaa solmun, jos se solmii sen paikallisella määrittelyllä joko where tai let

17 Kaksisuuntaisesti linkitty syklinen lista
data DList a = DNode (DList a) a (DList a) fromList :: [a] -> DList a fromList li = let (f, l) = go l li f in f where go prev [] next = (next, prev) go prev (x:xs) next = let this = DLNode prev x rest (rest,last) = go this xs next in (this, last)

18 Välitietorakenteena lista
Tuottaja ja kuluttaja 1 Välitietorakenteena lista Laiskuuden ansiosta lista on aina lyhyt (kuluttajan syötyä alkion se tuhoutuu roskienkeruussa) tuottaja kuluttaja tuottaja :: [a] kuluttaja :: [a] -> b

19 Tuottaja ja kuluttaja 2 tuottaja suodatin kuluttaja tuottaja :: [a]
suodatin :: [a] -> [b] kuluttaja :: [b] -> c

20 iterate ja repeat kuuluvat preludiin
Tuottajia repeat x = xs where xs = x : xs iterate f x = xs where xs = x : map f xs randoms seed = iterate f seed where f n = (25173 * n ) `mod` 65536 iterate ja repeat kuuluvat preludiin

21 [n..m] = takeWhile (<= m) [n..]
Eratostheneen seula Suodatin Tuottaja primes = sieve [2..] where sieve (x:xs) = x : sieve (filter f xs) where f y = y `mod` x /= 0 Myös tuottaja [n..] = iterate (+1) n [n..m] = takeWhile (<= m) [n..]

22 Striktit ja nonstriktit funktiot
Yksiparametrisen funktion sanotaan olevan strikti, jos f e sievenee pohjaksi aina, kun e sievenee pohjaksi lyhyesti. “f ⊥ = ⊥“ Muuten se on nonstrikti Moniparametriset funktiot tarkastellaan parametri kerrallaan pitäen muut vakioina “f a ⊥ c d = ⊥“ Esim. ⊥ && x = ⊥ mutta False && ⊥ = False Nonstriktit funktiot eivät ole mahdollisia applikatiivista järjestystä (arvovälitys) käytettäessä

23 Striktiyden aiheuttajia
Jos funktio on määritelty jonkin parametrin osalta (innokkaalla) hahmontunnistuksella, se on strikti siinä parametrissaan Innokkaita hahmoja ovat kaikki konstruktorihahmot kaikki vakiohahmot Laiskoja hahmoja ovat muuttujat jokerihahmo (_) tilde-hahmot (~...)

24 Tilde-hahmoista Ns. kiistämätön hahmo ~p, missä p on toinen hahmo
esim. ~(x,y) sovitus onnistuu aina tutkittavaa lauseketta ei tarvitse sieventää WHNF:ään jos ei sovitus onnistukaan, hahmon määrittelemien muuttujien arvo on pohja let-lausekkeessa hahmot ovat implisiittisesti tilde-hahmoja let (x,y) = ... in ... on sama kuin let ~(x,y) = ... in ...


Lataa ppt "Laiska laskenta, korekursio ja äärettömyys"

Samankaltaiset esitykset


Iklan oleh Google