Lataa esitys
Esittely latautuu. Ole hyvä ja odota
JulkaistuMaija-Leena Saarnio Muutettu yli 7 vuotta sitten
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
Samankaltaiset esitykset
© 2024 SlidePlayer.fi Inc.
All rights reserved.