Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

TIES341 Funktio-ohjelmointi 2 Kevät 2006

Samankaltaiset esitykset


Esitys aiheesta: "TIES341 Funktio-ohjelmointi 2 Kevät 2006"— Esityksen transkriptio:

1 TIES341 Funktio-ohjelmointi 2 Kevät 2006
ST- ja IO-monadit TIES341 Funktio-ohjelmointi 2 Kevät 2006

2 Muistattehan unifikaation
Sotkuista: Piti pitää huoli, että unifioitavat tyypit ovat ”ajan tasalla” Paljon saman työn uudelleen tekemistä Koodikin on sotkuista Idea: jos unifikaatio voisi korvata tyyppimuuttujan kaikki esiintymät suoraan korvattavalla tyypillä... olisi helpompaa elämä ei onnistu kovin helposti, kun ei ole sivuvaikutuksia sivuvaikutuksia voi emuloida, mutta hankalasti ja hitaasti miten saadaan sivuvaikutukset “kesytettyä” niin, että Haskellin kivat ominaisuudet (viittausten läpinäkyvyys ym.) säilyvät?

3 Viite John Launchbury, Simon L. Peyton Jones: “State in Haskell”. LISP and Symbolic Computation, vol. 8 no. 4, 1995.

4 ST-monadi ST s a ST s on monadi; ST s a on käsky
se s on ... taikasauva palataan siihen myöhemmin data STRef s a = ... kesy osoitin tyyppiä a olevaan dataan newSTRef :: a -> ST s (STRef s a) luo ja alustaa kesynosoittimen readSTRef :: STRef s a -> ST s a tähtää kesyä osoitinta pitkin ja hakee sen päästä arvo(kopio)n writeSTRef :: STRef s a -> a -> ST s () tähtää kesyä osoitinta pitkin ja kirjoittaa sen päähän

5 Se maaginen s Tyyppimuuttuja, joka edustaa senhetkistä “tilasäiettä”
Sitä ei koskaan korvata millään varsinaisella tyypillä s auttaa monadioperaatioita kutomaan erilliset kesyt muuttujat yhdeksi “tilasäikeeksi” seuraus: kaksi eri tilasäiettä eivät voi nähdä toistensa tilaa tod. siv., ks. edellä viitattu artikkeli Tilasäie luodaan runST-funktiolla: runST :: (forall s. ST s a) -> a huomaa forall! Tekee s:stä runST:n ensimmäisen parametrin paikallisen muuttujan ns. 2. kertaluokan polymorfismia runST:n argumentti ei saa olla monimutkainen lauseke, vain muuttuja käy

6 Yksi mahdollinen toteutus
Primitiivityyppi State s newtype ST s a = ST (State s -> (a, State s)) return a = ST $ \st -> (a,st) ST f >>= g = ST $ \st -> case f st of (a,st) -> case g a of ST g' -> g' st {-# NOINLINE runST #-} runST (ST f) = case f undefined of (a,_) -> a newSTVar ym. ovat kääntäjän tarjoamia primitiivejä

7 IO IO on yllättävän helppo laajennus ST:lle
newtype IO a = IO (ST RealWorld a) RealWorld on primitiivityyppi IO on siis ST, joka operoi “oikeassa maailmassa” data IORef a = IORef (STRef RealWorld a) newIORef a = IO $ newSTRef a ... getChar ym. primitiivejä

8 Varoitus Edellä annetut ST:n ja IO:n toteutukset ovat ESIMERKKEJÄ!
Oikea ohjelma ei pääse katsomaan ST:n ja IO:n sisälle (ovat abstrakteja)


Lataa ppt "TIES341 Funktio-ohjelmointi 2 Kevät 2006"

Samankaltaiset esitykset


Iklan oleh Google