Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Samankaltaiset tiedostot
Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

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

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

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ydin-Haskell Tiivismoniste

Haskell ohjelmointikielen tyyppijärjestelmä

Luku 3. Listankäsittelyä. 3.1 Listat

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

Ohjelmoinnin peruskurssien laaja oppimäärä

2.4 Normaalimuoto, pohja ja laskentajärjestys 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Demo 7 ( ) Antti-Juhani Kaijanaho. 9. joulukuuta 2005

Tämä tarina on Fibonaccin lukujen ongelman alkuperäinen muotoilu.

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

Funktionimien kuormitus. TIES341 Funktio ohjelmointi 2 Kevät 2006

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

ITKP102 Ohjelmointi 1 (6 op)

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

5.5 Jäsenninkombinaattoreista

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Java-kielen perusteet

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

14.1 Rekursio tyypitetyssä lambda-kielessä

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 26. kesäkuuta 2013

Tietorakenteet ja algoritmit

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Ohjelmoinnin peruskurssien laaja oppimäärä

ITKP102 Ohjelmointi 1 (6 op)

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Olio-ohjelmointi Syntaksikokoelma

Ohjelmoinnin peruskurssi Y1

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

ITKP102 Ohjelmointi 1 (6 op)

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

jäsennyksestä TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 29. syyskuuta 2016 TIETOTEKNIIKAN LAITOS Kontekstittomien kielioppien

Luento 5. Timo Savola. 28. huhtikuuta 2006

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

Java-kielen perusteita

A TIETORAKENTEET JA ALGORITMIT

8.5 Takarekursiosta. Sanoimme luvun 8.3 foldl -esimerkissämme että

2 Yhtälöitä ja epäyhtälöitä

TIES542 kevät 2009 Rekursiiviset tyypit

Harjoitus 5 -- Ratkaisut

Kysymyksiä koko kurssista?

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin peruskurssien laaja oppimäärä

Java-kielen perusteet

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

TIEDONHALLINTA - SYKSY Luento 10. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

Ohjelmoinnin peruskurssien laaja oppimäärä

Hohde Consulting 2004

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

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

Kesälukio 2000 PK2 Tauluharjoituksia I Mallivastaukset

5.1 Tyyppiparametrit. Nyt lisäämme parametrit myös data-määrittelyihin: data Nimi tp 1 tp 2 tp 3... tp k =...

15. Ohjelmoinnin tekniikkaa 15.1

7. Näytölle tulostaminen 7.1

13. Loogiset operaatiot 13.1

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Javan perusteita. Janne Käki

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Haskell 98. Puhdasta funktionalismia nonstriktissä paketissa. Antti-Juhani Kaijanaho

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

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

Ohjelmoinnin peruskurssien laaja oppimäärä

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet )

Ohjelmoinnin peruskurssien laaja oppimäärä

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

2.2.1 Ratkaiseminen arvausta sovittamalla

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

Muistutus aikatauluista

5/20: Algoritmirakenteita III

Ohjelmoinnin perusteet Y Python

15. Ohjelmoinnin tekniikkaa 15.1

Algoritmit 1. Luento 3 Ti Timo Männikkö

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

11.4. Context-free kielet 1 / 17

Reaalilukuvälit, leikkaus ja unioni (1/2)

5.3 Laskimen muunnelmia 5.3. LASKIMEN MUUNNELMIA 57

Chomskyn hierarkia. tyyppi 0 on juuri esitelty (ja esitellään kohta lisää) tyypit 2 ja 3 kurssilla Ohjelmoinnin ja laskennan perusmallit

3.1 Väliarvolause. Funktion kasvaminen ja väheneminen

Rekursiiviset tyypit

Kyselyn yleisrakenne:

Koe ma 1.3 klo salissa A111, koeaika kuten tavallista 2h 30min

sama tyyppi (joka vastaa kaikkien mahdollisten arvojen summa-aluetta). Esimerkiksi

JFO: Johdatus funktionaaliseen ohjelmointiin

Transkriptio:

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Tällä luennolla Algebralliset tietotyypit Hahmonsovitus (pattern matching) Primitiivirekursio Esimerkkinä binäärinen hakupuu

Muistattehan... Listatyyppi [a] [1,2,3,4] 1 : (2 : (3 : 4 : [])) eli 1 : 2 : 3 : 4 : [] Hahmonsovitus case foo of [] > Tyhjä _:_ > Ei tyhjä Nämä ovat erikoistapauksia

Algebralliset tietotyypit Haskellin tyyppijärjestelmän kulmakivi Teoriassa kaikki edellisellä luennolla esitetyt perustyypit ovat myös algebrallisia tyyppejä Kaksi keskeistä käsitettä: tyyppikoostin datakoostin

Algebrallisia tietotyyppejä: Bool tyyppikoostin datakoostimet data Bool = True False deriving (Read, Show, Eq, Ord, Enum, Bounded) avainsana tyyppiluokat, joihin tyyppi Bool kuuluu

Algebrallisia tietotyyppejä: Maybe tyyppikoostin datakoostimet tyyppimuuttuja data Maybe a = Nothing Just a deriving (Read, Show, Eq, Ord) avainsana tyyppiluokat, joihin tyyppi Maybe a kuuluu

Tyyppikoostin Tyypin nimi Kirjoitetaan isolla kirjaimella: Bool, Maybe Voi ottaa tyyppiparametreja (esim. Maybe a) tällöin kyseessä on geneerinen tyyppi tyyppimuuttuja voidaan korvata tyypillä: Maybe String (a = String) Maybe (Maybe Int) (a = Maybe Int)...

Datakoostin Esim. True, False, Just 42, Nothing Kirjoitetaan isolla kirjaimella Jos ei ota parametreja, on tyyppinsä vakio True, False, Nothing Jos ottaa parametreja, on funktio, joka luo tyyppinsä arvoja Just :: a > Maybe a

data... Algebrallisen tyypin määrittely on sen kuvaus, minkälaisia ko. tyypin lausekkeet ovat, kun niistä on ensin poistettu kaikki (ei koostin )funktiot Maybe Bool tyypin kaikki arvot ovat Nothing Just False Just True

Operatiivinen malli Koodissa Just 42 Muistissa Just 42 Nothing Nothing Ei koko totuus, mutta hyvä osatotuus

Listatyyppi ei ole erikoistapaus... paitsi syntaksiltaan data List a = Cons a (List a) Nil List Bool tyypin arvoja: Nil Cons False Nil Cons True Nil Cons False (Cons False Nil) Cons False (Cons True Nil)...

Listatyyppi ei ole erikoistapaus... paitsi syntaksiltaan data List a = Cons a (List a) Nil List Bool tyypin arvoja: Nil Cons False Nil Cons True Nil Cons False (Cons False Nil) Cons False (Cons True Nil)... data [a] = a : [a] [] (ei laillista Haskellia, mutta idea on oikein)

Listan operatiivinen malli [1,2,3,4] eli 1 : (2 : (3 : (4 : []))) (:) 1 (:) 2 (:) 3 (:) 4 []

Binäärinen hakupuu data BinTree k d = BTEmpty BTNode (BinTree k d) k d (BinTree k d) BTNode (BTNode BTEmpty Kissa 1 BTEmpty) Koira 42 (BTNode BTEmpty Tiikeri 33 BTEmpty) BTNode Koira 42 BTNode Kissa 1 BTNode Tiikeri 33 BTEmpty BTEmpty BTEmpty BTEmpty

Hahmonsovitus 1 Hahmonsovitus on se tapa, jolla pohjimmiltaan päästään käsiksi algebrallisen tietotyypin parametrisoidun koostimen luoman arvon sisälle Hahmonsovitus tapahtuu case lausekkeessa case lauseke of hahmo ehto > lauseke ehto > lauseke... where määrittely... hahmo ehto > lauseke...

Hahmonsovitus 2 case lauseke of hahmo ehto > lauseke ehto > lauseke... where määrittely... hahmo ehto > lauseke... case avainsanaa seuraava lauseke on se, jota ollaan nyt tutkimassa ehdot ovat tavallisia Bool tyyppisiä lausekkeita

Hahmonsovitus 3 case lauseke of hahmo ehto > lauseke ehto > lauseke... where määrittely... hahmo ehto > lauseke... nuolta seuraava lauseke on casen tulos, jos sitä vastaava hahmo sopii lausekeeseen ja sitä vastaava ehto on tosi hahmoja ja ehtoja tarkistetaan ylhäältä alaspäin

Hahmoja ovat... (1) muuttujat muuttuja sopii mihin tahansa ko. muuttujan näkyvyysalueeseen kuuluvat hahmoon liittyvät ehdot ja where osuus ehtoihin liittyvät lausekkeet avainsana _ (alaviiva) kuten muuttuja, mutta ei voi käyttää muuttujana ehdoissa tai lausekkeissa

Hahmoja ovat... (2) Datakoostimen käyttö parametrien paikalla hahmoja hahmo sopii, jos tutkittava arvo on luotu ko. datakoostimella ja parametrihahmot sopivat esim. Just x yleensä laitettava sulkeisiin Ns. @ hahmo: muuttuja@hahmo muuttuja saa arvokseen hahmoon sovitettavan arvon lisäksi ko. arvoa sovitetaan hahmoon

Hahmoja ovat... (3) Laiska hahmo: ~hahmo sovitus jätetään myöhemmälle, oletetaan että onnistuu jos hahmossa käytettyjä muuttujia yrittää käyttää, eikä hahmo sovikaan, on tuloksena virhe (vrt. nollalla jako) harvoin tarvitaan Numero ym. vakiot sopii, jos tutkittava arvo on sama kuin ko. vakion arvo

Hahmonsovitus 4 case Left (Just 42) of Right _ > oikea arvo Left Nothing > vasen ei mikään Left (Just x) x < 0 > vasen nega otherwise > vasen pos Mikä on tuon lausekkeen tulos?

Kielioppimakeinen f hahmo1 hahmo2 testi1 = lauseke1 testi2 = lauseke2 where määritelmä f hahmo3 hahmo4 = lauseke3 on suunnilleen sama kuin f x y = case (x,y) of (hahmo1, hahmo2) testi1 > lauseke1 testi2 > lauseke2 where määritelmä (hahmo3, hahmo4) > lauseke3

Primitiivirekursio Useimmat algebrallisia tietotyyppejä koskevat operaatiot ovat primitiivirekursiivisia Primitiivirekursiivisen funktion kaava: f :: DataType > joku tyyppi f CA = jokin vakio f CB = jokin vakio f (CC x) =... f x... f (CD x y) =... f x... f y... tässä DataType on määritelty näin: data DataType = CA CB CC joku CD toi nen

Muistathan: binäärinen hakupuu data BinTree k d = BTEmpty BTNode (BinTree k d) k d (BinTree k d) BTNode (BTNode BTEmpty Kissa 1 BTEmpty) Koira 42 (BTNode BTEmpty Tiikeri 33 BTEmpty) BTNode Koira 42 BTNode Kissa 1 BTNode Tiikeri 33 BTEmpty BTEmpty BTEmpty BTEmpty

Haku binäärisestä puusta data BinTree k d = BTEmpty BTNode (BinTree k d) k d (BinTree k d) lookup :: Ord k => k > BinTree k d > Maybe d lookup key tree = loop tree where loop BTEmpty = Nothing loop (BTNode left key' datum right) key < key' = loop left key > key' = loop right otherwise = Just datum loop on primitiivirekursiivinen

Haku binääripuusta: Esimerkki (1) lookup :: Ord k => k > BinTree k d > Maybe d lookup key tree = loop tree where loop BTEmpty = Nothing loop (BTNode left key' datum right) key < key' = loop left key > key' = loop right otherwise = Just datum lookup Tiikeri (BTNode (BTNode BTEmpty Kissa 1 BTEmpty) Koira 42 (BTNode BTEmpty Tiikeri 33 BTEmpty))

Haku binääripuusta: Esimerkki (2) lookup :: Ord k => k > BinTree k d > Maybe d lookup key tree = loop tree where loop BTEmpty = Nothing loop (BTNode left key' datum right) key < key' = loop left key > key' = loop right otherwise = Just datum let key = Tiikeri in loop (BTNode (BTNode BTEmpty Kissa 1 BTEmpty) Koira 42 (BTNode BTEmpty Tiikeri 33 BTEmpty))

Haku binääripuusta: Esimerkki (3) lookup :: Ord k => k > BinTree k d > Maybe d lookup key tree = loop tree where loop BTEmpty = Nothing loop (BTNode left key' datum right) key' < key = loop left key' > key = loop right otherwise = Just datum let key = Tiikeri in case BTNode (BTNode BTEmpty Kissa 1 BTEmpty) Koira 42 (BTNode BTEmpty Tiikeri 33 BTEmpty) of BTEmpty > Nothing BTNode left key' datum right key < key' = loop left key > key' = loop right otherwise = Just datum

Haku binääripuusta: Esimerkki (4) lookup :: Ord k => k > BinTree k d > Maybe d lookup key tree = loop tree where loop BTEmpty = Nothing loop (BTNode left key' datum right) key' < key = loop left key' > key = loop right otherwise = Just datum let key = Tiikeri in case BTNode (BTNode BTEmpty Kissa 1 BTEmpty) Koira 42 (BTNode BTEmpty Tiikeri 33 BTEmpty) of BTEmpty > Nothing BTNode left key' datum right Tiikeri < key' = loop left Tiikeri > key' = loop right otherwise = Just datum

Haku binääripuusta: Esimerkki (5) lookup :: Ord k => k > BinTree k d > Maybe d lookup key tree = loop tree where loop BTEmpty = Nothing loop (BTNode left key' datum right) key' < key = loop left key' > key = loop right otherwise = Just datum let key = Tiikeri in loop (BTNode BTEmpty Tiikeri 33 BTEmpty)

Haku binääripuusta: Esimerkki (6) lookup :: Ord k => k > BinTree k d > Maybe d lookup key tree = loop tree where loop BTEmpty = Nothing loop (BTNode left key' datum right) key' < key = loop left key' > key = loop right otherwise = Just datum let key = Tiikeri in case BTNode BTEmpty Tiikeri 33 BTEmpty of BTEmpty > Nothing BTNode left key' datum right key' < key = loop left key' > key = loop right otherwise = Just datum

Haku binääripuusta: Esimerkki (7) lookup :: Ord k => k > BinTree k d > Maybe d lookup key tree = loop tree where loop BTEmpty = Nothing loop (BTNode left key' datum right) key' < key = loop left key' > key = loop right otherwise = Just datum case BTNode BTEmpty Tiikeri 33 BTEmpty of BTEmpty > Nothing BTNode left key' datum right key' < Tiikeri = loop left key' > Tiikeri = loop right otherwise = Just datum ==> Tulos: Just 33

Primitiivirekursiosta vielä (1) Määritellään, että lausekkeen paino on siinä esiintyvien konstruktoreiden lukumäärä kunhan ensin on avattu kaikki määritelmät, niin että lausekkeessa ei esiinny määriteltyjä funktioita tai vakioita Yksiparametrinen, paloittain määritelty rekursiivinen funktio on primitiivirekursiivinen, jos funktion parametrin paino on kussakin palassa suurempi kuin ko. palan määrittelevässä lausekkessa esiintyvien rekursiivisten kutsujen argumenttien yhteenlaskettu paino

Primitiivirekursiosta vielä (2) lookup :: Ord k => k > BinTree k d > Maybe d lookup key tree = loop tree where loop BTEmpty = Nothing loop (BTNode left key' datum right) key' < key = loop left key' > key = loop right otherwise = Just datum Parametrin paino on 1 Argumentin paino on 0 ==> loop on primitiivirekursiivinen

Primitiivirekursiosta vielä (3) Primitiivirekursiivinen laskenta päättyy aina On olemassa ongelmia, joita ei voi ratkaista primitiivirekursiolla silloin käytetään yleistä rekursiota Mutta: on hyvä aina yrittää tehdä ensin primitiivirekursiivinen ratkaisu ennen kuin yrittää yleistä rekursiota Primitiivirekursiota sanotaan myös rakennerekursioksi (structural recursion)