Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

Samankaltaiset tiedostot
Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

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

Ydin-Haskell Tiivismoniste

Haskell ohjelmointikielen tyyppijärjestelmä

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

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

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

5.5 Jäsenninkombinaattoreista

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

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

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

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

5.3 Laskimen muunnelmia 5.3. LASKIMEN MUUNNELMIA 57

14.1 Rekursio tyypitetyssä lambda-kielessä

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Funktionimien kuormitus. TIES341 Funktio ohjelmointi 2 Kevät 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.

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Luku 3. Listankäsittelyä. 3.1 Listat

TIES542 kevät 2009 Rekursiiviset tyypit

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

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

- Komposiittityypit - Object (Mukaanlukien funktiot) - Array. - Erikoisdatatyypit - null - undefined

ITKP102 Ohjelmointi 1 (6 op)

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

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

Ohjelmoinnin peruskurssien laaja oppimäärä

ITKP102 Ohjelmointi 1 (6 op)

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

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

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

TIEA341 Funktio-ohjelmointi 1, kevät 2008

811120P Diskreetit rakenteet

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Yksinkertaiset tyypit

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

ITKP102 Ohjelmointi 1 (6 op)

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

Staattinen tyyppijärjestelmä

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Rekursiiviset tyypit

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Olio-ohjelmointi Syntaksikokoelma

Hohde Consulting 2004

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmointi 1 C#, kevät 2013, 2. tentti

1. Mitä tehdään ensiksi?

Ohjelmoinnin peruskurssien laaja oppimäärä

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

C++11 lambdat: [](){} Matti Rintala

Ohjelmoinnin perusteet Y Python

Luku 15. Parametripolymorfismi Kumitus

Tietorakenteet ja algoritmit - syksy

Tutoriaaliläsnäoloista

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:

lausekkeiden tapauksessa. Jotkin ohjelmointikielet on määritelty sellaisiksi,

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Harjoitus 5 -- Ratkaisut

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssi Y1

Ohjelmointiharjoituksia Arduino-ympäristössä

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

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

Tietorakenteet ja algoritmit

Ohjelmointi 1 C#, kevät 2013,

ITKP102 Ohjelmointi 1 (6 op)

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

semantiikasta TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho 5. lokakuuta 2009 TIETOTEKNIIKAN LAITOS Ohjelmointikielten staattisesta

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Harjoitustyö: virtuaalikone

Ohjelmoinnin jatkokurssi, kurssikoe

Rekursiiviset tyypit - teoria

7/20: Paketti kasassa ensimmäistä kertaa

Ohjelmoinnin peruskurssien laaja oppimäärä

Rajapinta (interface)

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

Luokan sisällä on lista

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

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

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Javan perusteita. Janne Käki

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

3. Muuttujat ja operaatiot 3.1

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

Ohjelmointi 1 Taulukot ja merkkijonot

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

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

Transkriptio:

Taas laskin TIES341 Funktio ohjelmointi 2 Kevät 2006

Rakennepuutyyppi data Term = C Rational T F V String Term :+: Term Term : : Term Term :*: Term Term :/: Term Term :==: Term Term :/=: Term Term :<=: Term Term :>=: Term Term :<: Term Term :>: Term Let (String,Term) Term If Term Term Term funktiokutsu Term :@: Term rekursiivinen funktiomäärittely Fun [(String,[String],Term)] Term deriving (Show,Eq,Ord)

Laskin Laskimen keskeiset määrittelyt: eval :: (MonadError String e,monadreader ValueEnv m) => Expr > m Value data Value = R Rational B Bool FV [String] [Value] ValueEnv type ValueEnv = Map String Value eval on primitiivirekursiivinen! eval käyttää MonadReaderia laskentaympäristön hallintaan laskentaympäristö: muuttujien arvot ko.kohdassa koska muuttujiin ei voi sijoittaa, MonadReader riittää

Paloja laskimesta eval F = return (B False) eval (V s) = do e < ask case lookupfm e s of Just v > return v eval (t1 :+: t2) = do R v1 < eval t1 R v2 < eval t2 return $ apply (+) v1 v2 eval (Let (x,e) e') = do v < eval e local (\env > addtofm env x v) $ eval e' eval (If te th el) = do B ter < eval te case ter of True > eval th False > eval el Huomaa: laskin kaatuu, jos syötteessä on tyyppivirheitä sen sijaan nollallajakaminen aiheuttaa siistin poikkeuksen tarkoituksellista!

Funktiot Funktio on arvo, joka pitää sisällään: termin muuttujanimien ( parametrien ) listan laskentaympäristön termin vapaiden muuttujien arvot funktionluontikohdassa! (Täysi) funktiokutsu: funktiotermi lasketaan ympäristössä, jossa parametreille on annettu argumenttilausekkeiden arvot huom! laskentaympäristö johdetaan funktiossa mukana pidetystä laskentaympäristöstä, ei kutsun ympäristöstä muuten tulee ns. dynamic scoping, jossa funktio näkee kutsujansa paikalliset muuttujat

Osittaiskutsu Jos funktiolla on 3 parametria ja sitä kutsutaan kahdella, mitä tapahtuu? palautetaan funktio, joka ottaa sen puuttuvan, kolmannen parametrin tätä sanotaan osittaiskutsuksi (partial application) Osittaiskutsun vuoksi funktioarvo sisältää em:n lisäksi: listan arvoja, jotka on osittaiskutsuilla annettu osalle parametreista

Arvot data Value = R Rational B Bool FV [String] [Value] Term ValueEnv deriving (Show) Funktion parametrit Jo annettujen argumenttien arvot

Kutsu eval (f :@: e) = do FV xs vs b env < eval f ev < eval e let vs' = ev : vs case length xs == length vs' of True > local (\_ > Map.union (Map.fromList (zip xs (reverse vs'))) env) $ eval b False > return $ FV xs vs' b env

Funktioiden määrittely eval (Fun defs t) = do env < ask let fs = map (\(f,ps,b) > (f, FV ps [] b env)) defs local (\env > Map.fromList fs `Map.union` env) $ eval t

Tyyppitarkastus Tyyppitarkastus pitää huolen siitä, että lauseke on hyvinmääritelty ei yritetä laskea funktioita yhteen ei yritetä käyttää muuttujia, joita ei ole määritelty Laskimen ei tarvitse tarkistaa näitä mahdollisesti jopa nopeusetu tyyppivirheet havaitaan heti alussa Periaate: lasketaan lausekkeen arvo abstraktisti eli lasketaan tyypeillä (arvojoukoilla) ei arvoilla primitiivirekursio, pääsääntöisesti etenee rakennepuun latvoista tyveen

Tyypit data Type = RT BT Type : > Type deriving (Show,Eq,Ord)

Ongelma: funktioiden tyyppitarkastus Miten selvittää funktion tyyppi, jos sitä ei ole kerrottu? Miten selvittää keskenään rekursiivisten funktioiden tyypit?! Ratkaisu: arvataan, että kaksiparametrisen funktion tyyppi on vaikkapa a > b > c annetaan tyyppitarkastuksen tarkentaa nuo tyyppimuuttujat

Tyypit, uudestaan data Type = RT BT TVar Int Type : > Type deriving (Show,Eq,Ord)

Korvaus Korvaus on kuvaus tyyppimuuttujilta tyypeille Korvasta voidaan soveltaa tyyppeihin: korvataan tyypissä esiintyvät tyyppimuuttujat samanaikaisesti korvauksen mukaisilla tyypeillä type Subst = Map Int Type subst :: MonadState Subst m => Type > m Type subst RT = return RT subst BT = return BT subst (TVar n) = do sb < get case Map.lookup n sb of Just ty > return ty Nothing > return $ TVar n subst (t : > u) = do t' < subst t u' < subst u return (t' : > u')

Unifikaatio (1) Unifikaatio ongelma: Onko olemassa korvaus, joka saa nämä kaksi tyyppiä olemaan samat? Robinsonin unifikaatio algoritmi (JACM 1965): vertaile kahden tyypin konstruktoria: onko samat? jos kyseessä ei ole TVar, käy rekursiivisesti läpi alityypit esim. t > u ==> unify t, unify u jos jompi kumpi on TVar, lisää korvaukseen sijoitus tuosta muuttujasta toiseen tyyppiin jos kumpikaan ei ole TVar eikä niillä ole samat konstruktorit, unifikaatio epäonnituu

Unifikaatio (2) occursin :: Int > Type > Bool n `occursin` TVar n' = n == n' n `occursin` (t : > u) = n `occursin` t && n `occursin` u _ `occursin` _ = False unify :: (MonadError String m, MonadState Subst m) => Type > Type > m () unify RT RT = return () unify BT BT = return () unify (t : > u) (t' : > u') = do unify t t' v < subst u v' < subst u' unify v v' unify (TVar n) ty n `occursin` ty = throwerror "occurs check failed" otherwise = modify (\sb > addtofm sb n ty) unify t1 t2@(tvar _) = unify t2 t1 unify = throwerror "unification failed"

Occurs check Jos ollaan lisäämässä sijoitusta muuttujasta a tyyppiin t, pitää tarkistaa, esiintyykö a t:ssä jos esiintyy, niin tyyppi on äärettömän pitkä se on hylättävä

Tyyppitarkastus Tyyppi, jota ei heti pystytä päättelemään, jätetään avoimeksi laitetaan tyypiksi uusi tyyppimuuttuja sellainen, jota ei ole vielä käytetty vrt. D4:n UniqueSupply Tyyppien samuuden tarkastamisen sijasta koetetaan unifioida ne Koodi nähtiin viime luennolla

Polymorfismi? Edellä esitelty tyyppimuuttujatemppu ratkaisee mainiosti funktioiden tyypityksen ongelman Sivutuotteena syntyy melkein geneerisiä tyyppejä esim. id x = x, tyypitys a > a mutta ei täysin fun g x y = 0; id x = x in g (id 3) (id True) ei tyypity oikein, koska id on monomorfinen: sitä voi käyttää vain yhden tyypin kanssa Ratkaisu: joka kerta kun funktion nimi kysytään ympäristöstä, annetaan sille eri tyyppimuuttujat

Tyyppiskeemat ja tyypin yleistäminen Tyyppiskeema on tyyppimuuttujajoukon (listan) ja tyypin muodostama pari idea: listatut tyyppimuuttujat ovat geneerisiä eli polymorfisia, muut monomorfisia Tyyppiympäristö yhdistää nyt muuttujia tyyppiskeemoihin Fun rakenteen tyypitys etenee seuraavasti: arvataan funktioiden tyypit tyypitetään funktiot ympäristössä, jossa arvatut tyypit ovat monomorfisia (tyyppiskeeman tyyppimuuttujalista on tyhjä) tyypitetään in lauseke ympäristössä, jossa funktioiden tyypit ovat geneerisiä

Yleistämisestä Yleistäminen tapahtuu fun lausekkeen tyypityksen yhteydessä kun määritellyt funktiot on tyypitetty mutta ennen kuin in lauseke tyypitetään Kunkin funktion tyypistä yleistetään kaikki ne tyyppimuuttujat, jotka eivät esiinny vapaana funlausekkeen tyyppiympäristön tyypeissä vapaana tarkoittaa: ei ole geneerinen muuttuja ko. yhteydessä