Monadeja siellä, monadeja täällä... monadeja kaikkialla? TIES341 Funktio ohjelmointi 2 Kevät 2006

Samankaltaiset tiedostot
TIEA341 Funktio-ohjelmointi 1, kevät 2008

5.5 Jäsenninkombinaattoreista

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

TIEA341 Funktio-ohjelmointi 1, kevät 2008

5.3 Laskimen muunnelmia 5.3. LASKIMEN MUUNNELMIA 57

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Uusi näkökulma. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Laajennetaan vielä Ydin-Haskellia ymmärtämään vakiomäärittelyt. Määrittely on muotoa

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmoinnin peruskurssien laaja oppimäärä

TIEA341 Funktio-ohjelmointi 1, kevät 2008

6 Algebralliset tietotyypit

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Ohjelmoinnin peruskurssien laaja oppimäärä

Luku 5. Monadit. 5.1 Siirrännän ongelma

Tietorakenteet ja algoritmit

Funktionimien kuormitus. TIES341 Funktio ohjelmointi 2 Kevät 2006

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Tämän vuoksi kannattaa ottaa käytännöksi aina kirjoittaa uuden funktion tyyppi näkyviin, ennen kuin alkaa sen määritemää kirjoittamaan.

ITKP102 Ohjelmointi 1 (6 op)

Tietorakenteet ja algoritmit

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Olio-ohjelmointi Syntaksikokoelma

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Luku 3. Listankäsittelyä. 3.1 Listat

1. Omat operaatiot 1.1

1. Olio-ohjelmointi 1.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Alityypitys. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Tietueet. Tietueiden määrittely

HAAGA-HELIA Heti-09 1 (12) ICT05 Tiedonhallinta ja Tietokannat O.Virkki Näkymät

Harjoitustyö: virtuaalikone

Tietorakenteet ja algoritmit - syksy

13. Loogiset operaatiot 13.1

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

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmointi 1 Taulukot ja merkkijonot

Ohjelmoinnin peruskurssien laaja oppimäärä

TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä

Geneeriset tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

13. Loogiset operaatiot 13.1

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Bootstrap / HTDP2 / Realm of Racket. Vertailu

Tero Jäntti

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmointiharjoituksia Arduino-ympäristössä

Dynaaminen muisti Rakenteiset tietotyypit

Java-kielen perusteet

7.5 Monadimuuntimet. Vaikka monadinen tyypitus on monoliittista, niin monadit voi suunnitella ja toteuttaa hierarkisesti.

Luku 4. Tietorakenteet funktio-ohjelmoinnissa. 4.1 Äärelliset kuvaukset

5.2.5 Konstruktoriluokat Edellisessä esimerkissä määrittelimme oman tyyppiluokan Isqrt jonka jäsenet olivat tyyppejä (kuten Int, Integer, Word,...).

Ensimmäisen kertaluvun yhtälön numeerinen ratkaiseminen

Listarakenne (ArrayList-luokka)

Ohjelmoinnin perusteet Y Python

Makrojen mystinen maailma lyhyt oppimäärä

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

815338A Ohjelmointikielten periaatteet

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmoinnin perusteet Y Python

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

19. Olio-ohjelmointia Javalla 19.1

4. Olio-ohjelmoinista lyhyesti 4.1

Matlab- ja Maple- ohjelmointi

Haskell ohjelmointikielen tyyppijärjestelmä

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

Lyhyt kertaus osoittimista

4. Luokan testaus ja käyttö olion kautta 4.1

Java kahdessa tunnissa. Jyry Suvilehto

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Ohjelmoinnin peruskurssien laaja oppimäärä

Arduino. Kimmo Silvonen (X)

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Ohjelmoinnin perusteet Y Python

main :: IO () main = interact (concatmap ((++"\n"). reverse). lines)

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Transkriptio:

Monadeja siellä, monadeja täällä... monadeja kaikkialla? TIES341 Funktio ohjelmointi 2 Kevät 2006

Materiaalia Paras verkkomatsku: http://www.nomaware.com/monads/html/

Komentoanalogiasta vielä Monadityypin m a arvo on komento Huom! Komento on eri asia kuin teko m a tyyppisen lausekkeen laskeminen normaalimuotoon ei aiheuta ko. komennon suorittamista m a tyyppinen lauseke on komennon kuvaus Milloin komento suoritetaan? IO tyyppinen komento suoritetaan vain ja ainoastaan, jos se on sidottu Main modulin main funktioon muissa monadeissa muita tapoja

Monadiluettelo Seuraavassa erilaisia monadimalleja Perustuvat komentoanalogiaan Kukin monadi tuo jonkin imperatiivisen ohjelmoinnin aspektin käyttöön silti koodi on täysin puhtaasti funktionaalista Monadit piilottavat putkiston niin, että itse ongelman ratkaisu on selkeä taitavasti käytettynä

Identiteettimonadi Yksinkertaisin mahdollinen monadi itsessään täysin hyödytön Ei tuo mitään imperatiivisia ominaisuuksia käyttöön newtype Identity a = Identity a instance Monad Identity where return = Identity Identity a >>= f = Identity (f a)

Virhemonadit Poikkeustenkäsittely class Error a where nomsg :: a strmsg :: String > a class Monad m => MonadError e m m > e where throwerror :: e > m a catcherror :: m a > (e > m a) > m a

Virhemonadit: Either String instance Error String where nomsg = unspecified error strmsg s = s instance MonadError String (Either String) where throwerror e = Left e catcherror (Left e) f = f e catcherror ma _ = ma

Listamonadit Kuten aiemmin tuli esitettyä, lista on monadi Lista edustaa hyväntahtoista epädeterminismiä

Tilamonadit 1 Tilamonadi tuo mukaan laskennan tilan class Monad m => MonadState s m m > s where get :: m s put :: s > m () gets :: MonadState s m => (s > a) > m a gets f = do st < get return (f st)

Tilamonadit 2 newtype State s a = State (s > (a,s)) instance Monad (State s) where return a = State (\s > (a,s)) State f >>= g = State $ \s > case f s of (a,s) > case g a of State g' > g' s instance MonadState s (State s) where get = State (\s > (s,s)) put s = State (\_ > ((),s)) runstate :: State s a > s > (a, s) runstate (State f) = f

Ai niin: tietueet data Member = Member { name :: String, age :: Int } Tietue on algebrallisen tietotyypin yleistys kaikki se, mitä data määrittelystä on aiemmin sanottu, pätee Tietueen luonti: Member { name = AJK, age = 28 } Hahmonsovitus: case m of Member { age = 28 } >... Päivitys: m { name = KJK } tässä m :: Member huom! luo kopion tietueesta, ei muuta sitä oikeasti Luku: name m name :: Member > String; age :: Member > Int

Tilamonadit 3 Tilamonadin tila on usein tietue Tilan yhden kentän lukemisessa gets funktio on kiva, esim. gets age on komento, joka palauttaa Membertyyppisen tilan age kentän arvon

Jäsenninmonadi (1) Jäsentimet ovat myös monadeita: newtype Parser t a = Parser ([t] > [(a,[t])] instance Monad (Parser t) where return a = Parser (\ts > [(a,ts)]) Parser p >>= f = Parser $ \ts > flip map (p ts) $ \(a,ts') > case f a of Parser g > g ts'

Jäsenninmonadi (2) instance MonadPlus (Parser t) where mzero = Parser (\_ > []) Parser f `mplus` Parser g = Parser $ \ts > f ts ++ g ts Jäsenninmonadi on olennaisesti lista ja tilamonadin yhdistelmä

Ympäristömonadi Ympäristömonadi (reader monad) on kuin tilamonadi, jonka tilaa ei voi muuttaa tilan voi kyllä syrjäyttää rajatulla alueella class Monad m => MonadReader e m m > e where ask :: m e local :: (e > e) > m a > m a

Ympäristömonadi newtype Reader e a = Reader (e > a) instance Monad (Reader e) where return a = Reader (\_ > a) Reader f >>= g = Reader $ \e > case g (f e) of Reader g' > g' e instance MonadReader e (Reader e) where ask = Reader id local f (Reader g) = Reader (\e > g (f e))

Vakiokirjaston monadit Kaikki edellä esitellyt monadit löytyvät kirjastoista Control.Monad.* Text.ParserCombinators.* ym.

Monadien yhdistäminen Käytännön sovelluksissa joutuu yleensä yhdistelemään eri monadipohjia Käsin tehtynä hyvin työlästä Vakiokirjastossa monadimuuntimet esim. ReaderT Monadimuuntimista saa rakennettua helposti monadipinoja type MyMonad a = ReaderT Env (StateT State Identity) a