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
Hughesin nuolet TIES341 Funktio-ohjelmointi 2 Kevät 2006

2 Lisälukemista John Hughes: “Generalising monads to arrows”, Science of Computer Programming, vol. 37 (2000) Ross Paterson: “A New Notation for Arrows”, Proc. ICFP 2001. Ross Paterson: “Arrows and computation”, Chapter 10 in Jeremy Gibbons & Oege de Moor (ed): The Fun of Programming. Palgrave, 2003. Anthony Courtney & Conal Elliott: “Genuinely Functional User Interfaces”, Proc. Haskell Workshop, 2001.

3 Monadien ongelma Koko monadisysteemi perustuu bind-operaatioon (>>=) peräkkäistys toimii ihan hyvin, jos ainoa mikä kiinnostaa on tuloksen “dynaamiset” ominaisuudet esim. komennon sivuvaikutukset esim. komennon paluuarvo ongelma: staattiset ominaisuudet selviävät yleensä vasta, kun komento suoritetaan useimmat staattiset ominaisuudet riippuvat jälkimmäisen(kin) osakomennon staattisista ominaisuuksista esim. jäsentimen FIRST-joukko

4 Nuoli Nuoli on tyyppikoostin, jonka kind on * -> *- > * ja jolla on tietyt operaatiot nuolet kuuluvat tyyppiluokkaan Arrow a b c, missä a on nuoli, tulkitaan seuraavasti: a b c on komento b on sen syöte c on sen tuloste mikä tahansa funktio kelpaa nuoleksi: arr :: Arrow a => (b -> c) -> a b c voidaan siis ajatella, että nuoli on funktion yleistys

5 Monadit ovat nuolia Jos meillä on monadi m, saamme siitä aikaiseksi ns. Kieslin nuolen: newtype Kiesli m b c = K (b -> m c) arr (K f) = K (\b -> return (f b)

6 Nuolien yhdistäminen Kuten funktioita, myös nuolia voidaan yhdistää:
(>>>):: Arrow a => a b c -> a c d -> a b d Kiesli-nuolilla: K f >>> K g = K (\b -> f b >>= g)

7 Datan jakaminen Käsitellään vain osa syötteestä
first :: Arrow a => a b c -> a (b,d) (c,d) Kieslin tapauksessa: first (K f) = K (\(b,d) -> f b >>= \c - return (c,d)) Peilikuva: second :: Arrow a => a b c -> a (d, b) (d, c) second f = arr swap >>> first f >>> arr swap Rinnakkainen käsittely: (***) :: Arrow a => a b c -> a d e -> a (b,d) (c,e) f *** g = first f >>> second g Syötteen jakaminen (&&&) :: Arrow a => a b c -> a b d -> a b (c,d) f &&& g = arr (\b -> (b,b)) >>> (f *** g)

8 Ehdolliset nuolet Valinta (oma tyyppiluokkansa)
(|||) :: ArrowChoice a => a b d -> a c d -> a (Either b c) d Yksinkertaisempi: left :: ArrowChoice a => a b c -> a (Either b d) (Either c d) Kiesli: left (K f) = K g where g (Left b) = f b >>= \c -> return (Left c) g (Right d) = return (Right d)

9 Nuolten kutsuminen ArrowApply-tyyppiluokka
app :: ArrowApply a => a (a b c, b) c syötteenä nuoli ja sen syöte suorita ko. nuoli ko. syötteellä ArrowApply-nuolet “ovat” myös monadeja: newtype ArrowMonad a c = M (a () c) instance ArrowApply a => Monad (ArrowMonad a) where return x = M (arr (\_ -> x)) M m >>= f = M $ m >>> arr (\x -> let M h = f x in (h,())) >>> app

10 Silmukat ArrowLoop loop :: ArrowLoop a => a (b,d) (c,d) -> a b c
kiintopisteoperaattori d:lle


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

Samankaltaiset esitykset


Iklan oleh Google