Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Monadit TIES341 Funktio-ohjelmointi 2 Kevät 2006.

Samankaltaiset esitykset


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

1 Monadit TIES341 Funktio-ohjelmointi 2 Kevät 2006

2 Abstraktio ● Monadi on huomattavan voimakas abstraktio – erikoinen säilöabstraktio – puhtaasti funktionaalinen imperatiivisen ohjelmoinnin abstrakttio ● eikä vain yhdenlaisen imperatiivisen ohjelmoinnin... ● Abstraktin paikan kammoisilla voi esiintyä aluksi huimausta –... mutta löytyy kyllä runsaasti käytännön sovelluksia – (eräiden asiantuntijoiden mielestä pelottavinta monadissa on nimi)

3 Monadi abstraktina tietotyyppinä ● Monadin kind on * -> * ● Monadilla m on seuraavat (perus)operaatiot: – liftM :: (a -> b) -> m a -> m b ● jos monadi olisi Functor, niin liftM olisi fmap – return :: a -> m a – join :: m (m a) -> m a – (>>=) :: m a - > (a -> m b) -> m b ● Em. operaatiot eivät ole kaikki toisistaan riippumattomia

4 Näkökulma 1: Imperatiivisuus ● Monadityypin m a arvot ovat komentoja ● Komentoja yhdistetään >>=-operaattorilla ● Kaikilla monadeilla on yhteinen primitiivioperaatio return – komento, joka palauttaa argumenttinsa ● Monadit eroavat toisistaan seuraavissa kohdissa: – mikä on monadin operatiivinen semantiikka – mitkä (muut) primitiivioperaatiot se tarjoaa – onko monadista mahdollista päästä pakoon?

5 Näkökulma 2: Säilö ● Monadityypin m a arvot ovat säilöjä ● Säilöjä yhdistetään join-funktiolla ● Säilön sisältöjä käsitellään liftM-funktiolla – liftM käyttäytyy mapin tavoin ● return-funktio luo säilön, joka sisältää yhden arvon ● Monadit eroavat toisistaan seuraavissa kohdissa: – minkä säiliösemantiikan monadi toteuttaa – mitä muita tapoja on käsitellä säilön sisältöjä?

6 return :: a -> m a ● Säilöajattelu: – tee säilö, joka sisältää vain annetun arvon ● Komentoajattelu: – komento, joka palauttaa annetun arvon

7 liftM :: (a -> b) -> m a -> m b ● Säilöajattelu: – “map” – sovella annettua funktiota säilön jokaiseen alkioon ● Komentoajattelu: – tee annetusta funktiosta komento

8 join :: m (m a) -> m a ● Säilöajattelu: – annettu säilö, joka sisältää säilöjä – tee säilö, joka sisältää syötesäilön sisältämien säilöjen sisältämät alkiot ● Komentoajattelu: – Komento, joka suorittaa annetun komennon ja sitten suorittaa komennon palauttaman komennon – join mma = mma >>= id – join mma = do ma <- mma ma

9 (>>=) :: m a -> (a -> m b) -> m b ● Säilöajatttelu: – sovella jokaiseen annetun säilön alkioon annettua funktiota – sitten yhdistä saadut säilöt – a >>= f = join $ liftM f a ● Komentoajattelu: – suorita ensimmäisenä annettu komento – anna ko. komennon palauttama arvo toiselle komennolle parametriksi ja suorita se

10 Monadilait return a >>= k= k a m >>= return= m m >>= (\x -> k x >>= h)= (m >>= k) >>= h

11 Esimerkkimonadi: Maybe ● Säilönäkökulma: – sisältää enintään yhden alkion ● Komentonäkökulma: – komentoja, jotka voivat epäonnistua – hyödyllinen näkökulma varsin usein – tarjoaa helpon tavan tehdä “poikkeuksia” puhtaasti funktionaalisessa koodissa Case f x of Just y -> g x do y <- f x Nothing -> Nothing g x

12 Esimerkkimonadi: Lista ● Säilönäkökulma: – Ilmeinen ● Komentonäkökulma: – ns. “hyväntahtoinen epädeterminismi” choose lo hi = [lo,hi] guard f x| f x= [x] | otherwise= []... dox <- choose 0 50 guard (\x -> x `mod` 2 == 0) x


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

Samankaltaiset esitykset


Iklan oleh Google