Funktionimien kuormitus. TIES341 Funktio ohjelmointi 2 Kevät 2006

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

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Haskell ohjelmointikielen tyyppijärjestelmä

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

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

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

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

Luku 3. Listankäsittelyä. 3.1 Listat

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

5.5 Jäsenninkombinaattoreista

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

TIEA341 Funktio-ohjelmointi 1, kevät 2008

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Funktion määrittely (1/2)

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

Lyhyt kertaus osoittimista

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

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Kielioppia: toisin kuin Javassa

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

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

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

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

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

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

koska sellainen vaaditaan jotta oma tyyppimme Tree k t pääsee jäseneksi Luokkaan Eq.

Mitä funktionaalinen ohjelmointi on

15. Ohjelmoinnin tekniikkaa 15.1

12 Mallit (Templates)

JavaScript alkeet Esimerkkikoodeja moniste 2 ( Metropolia)

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Harjoitus 1 -- Ratkaisut

Fortran 90/95. + sopii erityisesti numeriikkaan:

6 Eksponentti- ja logaritmifunktio

Java-kielen perusteet

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Ohjelmointi 1 C#, kevät 2013,

PHP tehtävä 3 Atte Pekarinen TIKT13A

Java-kielen perusteet

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Apuja ohjelmointiin» Yleisiä virheitä

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Ohjelmoinnin perusteet Y Python

15. Ohjelmoinnin tekniikkaa 15.1

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

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

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

Java-kielen perusteet

Tietueet. Tietueiden määrittely

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

Kaikkia alla olevia kohtia ei käsitellä luennoilla kokonaan, koska osa on ennestään lukiosta tuttua.

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

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Olio-ohjelmointi Syntaksikokoelma

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Harjoitus 3 (viikko 39)

Johdatus f90/95 ohjelmointiin. H, R & R luvut 1-3

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

Ohjelmoinnin perusteet Y Python

7. Näytölle tulostaminen 7.1

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Esimerkki 1: Kahviautomaatti.

1 Johdantoa. 1.1 Help: example, apropos ja describe. 1.2 Peruslaskutoimitukset + - * / ^ 1.3 Tärkeät erikoismerkit

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin peruskurssi Y1

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

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

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

Metodien tekeminen Javalla

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

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

4. Olio-ohjelmoinista lyhyesti 4.1

1. Omat operaatiot 1.1

C++11 seminaari, kevät Johannes Koskinen

SQL:N PERUSTEET OSIO 03 MARKKU SUNI

MATEMATIIKAN LATOMINEN LA T EXILLA, OSA 1

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

Matriiseista. Emmi Koljonen

Common Lisp Object System

Oliot viestivät metodeja kutsuen

Loppukurssin järjestelyt C:n edistyneet piirteet

Rajapinta (interface)

Ohjelmoinnin perusteet Y Python

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Transkriptio:

Funktionimien kuormitus TIES341 Funktio ohjelmointi 2 Kevät 2006

Kertausta ongelma Mikä on (+) operaattorin tyyppi? Num a => a -> a -> a Mikä on (==) operaattorin tyyppi? Eq a => a -> a -> a Mikä on show funktion tyyppi? Show a => a -> String Mikä on minbound vakion tyyppi? Bounded a => a

Kertausta erityistapausratkaisu Rajoitetaan geneeristä polymorfismia niin, että tyyppimuuttujan arvoalueeksi tulee jokin tietty tyyppijoukkko (tyypin konteksti) Num kaikki lukutyypit Eq kaikki tyypit, joilla on ekvivalenssirelaatio Show kaikki tyypi, jotka voidaan muuttaa merkkijonoksi Read kaikki tyypit, jotka voidaan muuttaa merkkijonosta... Pitääkö näiden olla kieleen pultattuja erityistapauksia?

Yleisempi ongelma Joskus on hyödyllistä ylikuormittaa omia funktionimiä esim. drawwindow jossain ikkunointijärjestelmässä nappula ja tekstinsyötin ovat molemmat ikkunoita, piirretään eri tavoin Ratkaisu: annetaan käyttäjälle mahdollisuus määritellä omia tyyppiluokkia tyyppiluokkaan kuuluville tyypeille on yhteistä, että niille kaikille on määritelty jotkin tietyt funktiot tyyppiluokan esittely määrittelee, mitkä nämä funktiot ovat tyypin liittäminen luokkaan määrittelee näiden funktioiden toiminnan ko. tyypin kohdalla

Yksinkertaisen tyyppiluokan esittely class Luokannimi tyyppimuuttuja where funktionimi :: tyyppi funktionimi :: tyyppi... funktionimi :: tyyppi Luokannimi on tästä lähtien tyyppiluokka funktionimet ovat tavallisia funktioiden nimiä, ja niitä funktioita voi käyttää tavalliseen tapaan funktion tyyppiin tulee lisää konteksti Luokannimi tyyppimuuttuja =>

Esimerkki class MyShow a where myshow :: a > String myshows :: a > ShowS Huomaa, myshow:n tyyppi ei ole kirjoitettu muotoon MyShow a => a > String tästä huolimatta sen tyyppi on MyShow a => a > String myshow ja myshows ovat tavallisia funktionnimiä!

Tyyppiluokka vs. olioluokka OO kielenkäytössä tyyppiluokka vastaa eniten rajapintaa (vrt. Java ym.) Tyyppiluokka on tyyppien joukko tyyppiluokkaan kuuluvien tyyppien yhteinen tekijä on se, että nille kaikille on määritelty tyyppiluokassa esitellyt funktiot tyyppiluokka ei ole tyyppi

Tyyppiluokan ilmentäminen instance Tyyppiluokka Tyyppi where funktionnimi parametrit = määrittely funktionnimi parametrit = määrittely... funktionnimi parametrit = määrittely Tyyppi kuuluu nyt Tyyppiluokkaan tässä on määriteltävä jokainen Tyyppiluokan esittelyssä esitelty funktio! funktioille ei kirjoiteta tyyppiesittelyä funktionnimi ::..., se tuli jo class osuudessa :)

Esimerkki instance MyShow String where myshow s = myshows s myshows s = shows s

Oletusmäärittelyt Luokan esittelyssä voidaan myös määritellä osa (jopa kaikki!) luokan funktioista (yleensä toistensa avulla) Tällöin luokan ilmentämisessä on tarpeen määritellä vain osa luokan funktioista class MyShow a where myshow :: a > String myshows :: a > String myshow s = myshows s myshows s = showstring (myshow s) instance MyShow String where myshow = show instance MyShow String where myshows = shows

(Rajoitettu) yleinen ilmentäminen instance MyShow a => MyShow [a] where myshows l = showchar '['. listshows l. showchar ']' listshows [] = listshows [x] = myshows x listshows (x:xs) = myshows x. showstring,. listshows xs Ilmennettävässä tyypissä voi käyttää myös tyyppimuuttujia Näitä tyyppimuuttujia voi myös rajoittaa kontekstilla

Tyyppiluokan periminen class MyShow a => MyPrecShow a where myprecshow :: Int > a > String myprecshows :: Int > a > ShowS myprecshow n s = myprecshows n s myprecshows n s t = myprecshow n s ++ t Luokanmäärittelyssä voidaan tyyppimuuttujaa rajoittaa kontekstilla ja näin periä jostain toisesta tyyppiluokasta jokainen tyyppi, joka ilmennetään luokkaan MyPrecShow, tulee olla jo ennestään MyShow luokan jäsen

Vakiokirjaston tyyppiluokka: Eq class Eq a where (==), (/=) :: a > a > Bool Minimal complete definition: (==) or (/=) x /= y = not (x == y) x == y = not (x /= y)

Vakiokirjaston tyyppiluokka: Ord class (Eq a) => Ord a where compare :: a > a > Ordering (<), (<=), (>=), (>) :: a > a > Bool max, min :: a > a > a Minimal complete definition: (<=) or compare Using compare can be more efficient for complex types. compare x y x == y = EQ x <= y = LT otherwise = GT x <= y = compare x y /= GT x < y = compare x y == LT x >= y = compare x y /= LT x > y = compare x y == GT note that (min x y, max x y) = (x,y) or (y,x) max x y x <= y = y otherwise = x min x y x <= y = x otherwise = y

Vakiokirjaston tyyppiluokka: Enum class Enum a where succ, pred :: a > a toenum :: Int > a fromenum :: a > Int enumfrom :: a > [a] [n..] enumfromthen :: a > a > [a] [n,n'..] enumfromto :: a > a > [a] [n..m] enumfromthento :: a > a > a > [a] [n,n'..m] Minimal complete definition: toenum, fromenum NOTE: these default methods only make sense for types that map injectively into Int using fromenum and toenum. succ = toenum. (+1). fromenum pred = toenum. (subtract 1). fromenum enumfrom x = map toenum [fromenum x..] enumfromto x y = map toenum [fromenum x.. fromenum y] enumfromthen x y = map toenum [fromenum x, fromenum y..] enumfromthento x y z = map toenum [fromenum x, fromenum y.. fromenum z]

Vakiokirjaston tyyppiluokka: Bounded class Bounded a where minbound :: a maxbound :: a

Vakiokirjaston tyyppiluokka: Num class (Eq a, Show a) => Num a where (+), ( ), (*) :: a > a > a negate :: a > a abs, signum :: a > a frominteger :: Integer > a Minimal complete definition: All, except negate or ( ) x y = x + negate y negate x = 0 x

Vakiokirjaston tyyppiluokka: Real class (Num a, Ord a) => Real a where torational :: a > Rational

Vakiokirjaston tyyppiluokka: Integral class (Real a, Enum a) => Integral a where quot, rem :: a > a > a div, mod :: a > a > a quotrem, divmod :: a > a > (a,a) tointeger :: a > Integer Minimal complete definition: quotrem, tointeger n `quot` d = q where (q,r) = quotrem n d n `rem` d = r where (q,r) = quotrem n d n `div` d = q where (q,r) = divmod n d n `mod` d = r where (q,r) = divmod n d divmod n d = if signum r == signum d then (q 1, r+d) else qr where qr@(q,r) = quotrem n d

Vakiokirjaston tyyppiluokka: Fractional class (Num a) => Fractional a where (/) :: a > a > a recip :: a > a fromrational :: Rational > a Minimal complete definition: fromrational and (recip or (/)) recip x = 1 / x x / y = x * recip y

Vakiokirjaston tyyppiluokka: Floating class (Fractional a) => Floating a where pi :: a exp, log, sqrt :: a > a (**), logbase :: a > a > a sin, cos, tan :: a > a asin, acos, atan :: a > a sinh, cosh, tanh :: a > a asinh, acosh, atanh :: a > a Minimal complete definition: pi, exp, log, sin, cos, sinh, cosh asin, acos, atan asinh, acosh, atanh x ** y = exp (log x * y) logbase x y = log y / log x sqrt x = x ** 0.5 tan x = sin x / cos x tanh x = sinh x / cosh x

Vakiokirjaston tyyppiluokka: RealFrac class (Real a, Fractional a) => RealFrac a where properfraction :: (Integral b) => a > (b,a) truncate, round :: (Integral b) => a > b ceiling, floor :: (Integral b) => a > b Minimal complete definition: properfraction truncate x = m where (m,_) = properfraction x round x = let (n,r) = properfraction x m = if r < 0 then n 1 else n + 1 in case signum (abs r 0.5) of 1 > n 0 > if even n then n else m 1 > m ceiling x = if r > 0 then n + 1 else n where (n,r) = properfraction x floor x = if r < 0 then n 1 else n where (n,r) = properfraction x

Vakiokirjaston tyyppiluokka: RealFloat class (RealFrac a, Floating a) => RealFloat a where floatradix :: a > Integer floatdigits :: a > Int floatrange :: a > (Int,Int) decodefloat :: a > (Integer,Int) encodefloat :: Integer > Int > a exponent :: a > Int significand :: a > a scalefloat :: Int > a > a isnan, isinfinite, isdenormalized, isnegativezero, isieee :: a > Bool atan2 :: a > a > a Minimal complete definition: All except exponent, significand, scalefloat, atan2 default definitions omitted

Vakiokirjaston tyyppiluokka: Read type ReadS a = String > [(a,string)] class Read a where readsprec :: Int > ReadS a readlist :: ReadS [a] Minimal complete definition: readsprec readlist =... omitted...

Vakiokirjaston tyyppiluokka: Show class Show a where showsprec :: Int > a > ShowS show :: a > String showlist :: [a] > ShowS Mimimal complete definition: show or showsprec showsprec _ x s = show x ++ s show x = showsprec 0 x "" showlist =... omitted...

Muut vakiokirjaston tyyppiluokat Functor, Monad, Monad.MonadPlus eivät ole yksinkertaisia tyyppiluokkia edellä esitetyssä mielessä torstaina näistä vähän lisää

deriving Tuttu deriving toimii edellä esitetyillä luokilla totuttuun tapaan kääntäjä tekee tyypin rakenteen mukaisen ilmentymän deriving ei toimi muilla tyyppiluokilla!