Luku 15. Parametripolymorfismi Kumitus

Koko: px
Aloita esitys sivulta:

Download "Luku 15. Parametripolymorfismi Kumitus"

Transkriptio

1 Luku 15 Parametripolymorfismi Lähes kaikessa ohjelmoinnissa tarvitaan säilöjä (engl. containers) ja niitä käsitteleviä operaatioita. Aiemmissa monisteissa esiteltiin NumList, joka oli numeroita sisältävä lista. Vastaavalla tavalla voitaisiin toteuttaa mitä tahansa muutakin nimettyä tyyppiä sisältävä listatyyppi, mutta ongelmaksi tulee, että tällainen koodin monistaminen on huonoa ohjelmointia. Yksi ei mitenkään harvinainen ratkaisu on käyttää alityypitystä (johon palataan seuraavassa luvussa) hyväksi ja tehdä listatyyppi, joka sisältää yleisimmän tyypin (esimerkiksi Javassa Object) arvoja. Ongelmaksi muodostuu listan alkioiden käsittely aitona itsenään, sillä se vaatii downcastausta, joka puolestaan on staattisesti tyypitetyssä kielessä huonoa tyyliä 1. Edellä kuvattu tilanne vastaa Java-kielen tilannetta ennen versiota 5, jolloin otettiin käyttöön generics-laajennus. Se perustuu Generic Java -kieleen (Bracha et al., 1998), jonka alkuperäiset kehittäjät ovat tyyppiteorian ja ohjelmointikielten teorian arvostettuja tutkijoita. Generic Javan taustalla on tässä luvussa käsiteltävät parametrisen polymorfismin perusteoriat, Girardin Systeemi F (sama kuin Reynoldsin polymorfinen lambda-kieli) sekä sen tyyppioperaattorilaajennus. Luvun päälähde on Pierce (2002, luvut 23 ja 29) Kumitus Kumitus (engl. erasure) on kuvaus tyypitetyltä kieleltä vastaavalle tyypittömälle kielelle siten, että ohjelmasta poistetaan kaikki viittaukset tyyppeihin muuttamatta ohjelman merkitystä. Esimerkiksi (puhtaasta) yksinker- 1 Downcastaus on olennaisesti dynaaminen tyyppitarkastus ohjelmoijan käskystä. 155

2 156 LUKU 15. PARAMETRIPOLYMORFISMI taisesti tyypitetystä lambdakielestä tyypittömään lambdakieleen: erase(x) = x erase(tu) = erase(t)erase(u) erase(λx : T t) = λx erase(t) Kaikilla kielillä ei ole kumitusta (esimerkiksi Haskellissa tyypeillä on myös dynaamista merkitystä) Monimuotoisuus Staattinen tyyppijärjestelmä voi pahimmillaan olla mahdottoman rajoittava pakkopaita. Tämän lieventämiseksi lähes kaikki staattisesti tyypitetyt kielet tukevat monimuotoisuutta muodossa tai toisessa. Monimuotoisuudella (polymorphism) tarkoitetaan sitä, että ohjelmointikielen aliohjelmalla voi olla useampi kuin yksi tyyppi. Cardelli ja Wegner (1985) jaottelevat monimuotoisuuden kahteen lajiin ja neljään alalajiin seuraavasti: yleinen monimuotoisuus (universal polymorphism) Yleisesti monimuotoinen aliohjelma toimii periaatteessa äärettömän monella, jollakin tapaa samanoloisella tyypillä. Tämä jaotellaan kahteen alalajiin: parametrinen monimuotoisuus (parametric polymorphism) Parametrisesti monimuotoinen aliohjelma ottaa parametrinaan tyypin, ja sen muiden parametrien tyypit saattavat riippua tuosta tyypistä. Kullekin tyypille funktion ohjelmakoodi on sama. sisällytysmonimuotoisuus (inclusion polymorphism) Sisällytysmonimuotoisuudessa oliolla voi olla useita tyyppejä, jotka ovat joukkoopin mielessä sisäkkäisiä. Kullakin näistä tyypeistä on oma versionsa sisällytysmonimuotoisesta aliohjelmasta, ja se, mikä tulee suoritettua, kun aliohjelmaa kutsutaan, riippuu siitä, mikä on pienin (eli spesifisin) tyyppi, joka oliolla on. satunnainen monimuotoisuus (ad hoc polymorphism) Satunnaisesti monimuotoinen aliohjelma toteuttaa eri tyypeille jossakin mielessä saman operaation, mutta tämän toteuttava koodi on tyypillisesti täysin erilainen kullekin tyypille ja tyypeillä ei ole mitään erityistä yhteyttä toisiinsa

3 15.3. SYSTEEMI F 157 monimäärittely (overloading) Monimäärittelyssä useammalla aliohjelmalla voi olla sama nimi. Aliohjelma tulee valittua parametrien määrän ja tyyppien perusteella. automaattinen tyypinmuunnos (coercion) Automaattinen tyypinmuunnos on tyypinmuunnos, joka tehdään ilman, että ohjelmoija sitä erikseen pyytää Systeemi F Jean-Yves Girardin Systeemi F, joka tunnetaan myös John Reynoldin laatimana polymorfisena lambdakielenä, on yksinkertaisesti tyypitetyn lambdakielen laajennus, joka mahdollistaa parametrisesti polymorfiset funktiot. Sen taustalla on seuraava probleema: mikä tyypitetyn lambda-kielen termi vastaa tyypittämättömän lambda-kielen termiä λxx? Yksinkertaisesti tyypitetyssä lambda-kielessä joudutaan valitsemaan jokin konkreettinen tyyppi, esimerkiksi λx : Num x taikka λx : Num Num x nämä kaikki kumittuvat λxx:ksi, mutta mitään niistä ei voi sanoa tuon funktion kanoniseksi tyypitetyksi versioksi. Toinen esimerkki tulee, kun ajatellaan parametrisesti polymorfisia tietorakenteita (joista tarkemmin myöhemmin). Oletetaan, että kielessä on tyyppinimi List T, jossa T:n voi korvata millä tahansa tyypillä ja List T on T-tyyppisiä alkioita sisältävä lista. Nyt kysymys kuuluu: onko mahdollista kirjoittaa map-funktiota, jolle voi antaa parametrina minkä tahansa listan (riippumatta alkiotyypistä)? Yksinkertaisesti tyypitetyssä lambdakielessä tämä ei ole mahdollista (ja sama ongelma on kaikilla monomorfisilla kielillä kuten C ja Pascal). Systeemi F:n taustalla on se havainto (jota sanotaan Curryn Howardin vastaavuudeksi), että yksinkertaisesti tyypitetyn lambda-kielen tyypit vastaavat suoraan (intuitionistisen) propositiologiikan kaavoja: funktiotyyppi vastaa implikaatiota ja perustyypit ovat propositiovakioita 2 ; termit puolestaan on mahdollista lukea näiden kaavojen todistuksiksi. Systeemi F laajentaa yksinkertaisesti tyypitettyä lambda-kieltä samaan tyyliin kuin toisen kertaluvun predikaattilogiikka laajentaa propositiologiikkaa: otetaan käyttöön tyyppikvanttori α T (myös kvanttori voidaan ottaa mukaan, mutta se ei kuulu Systeemi F:ään). Systeemi F:ssä identiteettifunktion I tyyppi on α α α ja map-funktion tyyppi on (olettaen List T-tyy- 2 Yksinkertaisesti tyypitetyssä lambda-kielessä ei ole tyyppejä T, T U eikä T U saati T U. Hauska harjoitus on pohdiskella, minkälaisia arvoja tällaissa tyypeissä voisi olla.

4 158 LUKU 15. PARAMETRIPOLYMORFISMI pin olemassaolo) α (α α) List α List α. Termien tasolla Systeemi F laajentaa lambda-kieltä ottamalla käyttöön tyyppiabstraktion λα t, joka muuttaa monomorfisen termin polymorfiseksi lisäämällä tyyppiin kvanttorin, sekä tyyppiapplikaation t T, joka muuttaa polymorfisen termin monomorfiseksi poistamalla tyypistä kvanttorin. Esimerkiksi identiteettifunktio I kirjoitettaisiin λα λx : α x, ja sitä käytettäisiin esimerkiksi lukuun tyyliin I Num 42. Muodollisesti Systeemi F määritellään seuraavasti. Määritelmä ei sisällä tyyppilaajennuksia kuten aritmetiikkaa taikka tietueita, mutta nuo laajennukset voidaan pultata Systeemi F:ään varsin helposti samaan tapaan kuin yksinkertaisesti tyypitettyyn lambda-kieleen. α, β, γ TypeVariables x, y, z Variables T, U, V Types T, U, V ::= α tyyppimuuttuja T U funktiotyyppi α T universaalityyppi t, u Terms t, u ::= x muuttuja tu (termi)applikaatio λx : T t (termi)abstraktio t T tyyppiapplikaatio λα t tyyppiabstraktio v Values v ::= w λx : T v λα v w Spines w x wv Kuten ennenkin, pitää määritellä korvausoperaattori ja vapaat muuttujat (tällä kertaa molemmat myös tyyppimuuttujille). Samoin tulisi määritellä termien ja tyyppien yhtäläisyys ( ) siten, että sidottujen termi- ja tyyppimuuttujien nimillä ei ole merkitystä. Sivuutetaan nuo tässä. Seuraavat β-sievennyssäännöt ovat laskennan perusta: (λx : T t) u t[x := u] (15.1)

5 15.4. TYYPPIOPERAATTORIT 159 (λα t) T t[α := T] (15.2) Lisäksi tarvitaan joukko sääntöjä, jotka sallivat osalausekkeiden sivennyksen: t t tu t u u u tu t u (15.3) (15.4) t t λx : T t λx : T t (15.5) t t t T t T (15.6) t t λα t λα t (15.7) Tyypityssäännöissä on Systeemi F:n olennainen sisältö. Ensiksi lambdakielen tavanomaiset säännöt: Γ, x : T x : T Γ t : U V Γ u : U Γ t u : V Γ, x : T u : U Γ (λx : T u) : T U Ja lopuksi tyyppiapplikaation ja -abstraktion säännöt: Γ t : α T Γ t U : T[α := U] Γ t : T Γ λα t : α T 15.4 Tyyppioperaattorit (15.8) U U (15.9) (15.10) (15.11) (x,u) Γ : α FV(U) (15.12) Systeemi F mahdollistaa parametrisesti polymorfiset funktiot mutta ei mahdollista parametrisoituja tyyppejä (joita tarvitaan yleisten, tyyppiturvallisten säiliöiden toteuttamiseen). Tyyppioperaattorien teoria mahdollistaa edellä annetun esimerkkityypin List toteuttamisen.

6 160 LUKU 15. PARAMETRIPOLYMORFISMI Tyyppioperaattoria kuten List on luonnollista ajatella tyyppitason funktioksi. Siksi luonnolliselta tuntuu lisätä tyyppien tasolle lambda-kielen perusoperaatiot (applikaatio ja abstraktio). Koska tyyppijärjestelmän tulee olla ratkeava, on ilmaisuvoimaa rajoitettava sen verran, että tyyppien sievennys päättyy aina. Yksinkertainen tapa tehdä tämä rajoitus on rakentaa tyypeille oma (yksinkertaisesti tyypitetty) tyyppijärjestelmänsä, sillä yksinkertaisesti tyypitetty lambda-kieli on ratkeava. Ideana on siis rakentaa kolmitasoinen kieli, jossa itse laskenta tapahtuu alimmalla, termien tasolla; keskimmäinen taso on puolestaan tyyppien taso, ja ylimpänä tasona on tyyppien tyyppijärjestelmä. Jotta sanat eivät menisi sekaisin, kutsutaan tyyppien tyyppejä luonteiksi (engl. kinds). Luonteita ovat muiden muassa, joka tarkoittaa tavallista tyyppiä, ja, joka tarkoittaa tyyppioperaattoria, joka ottaa yhden tyyppiparametrin. Tyyppioperaattoreita (sekä monikko-, variantti- ja µ-laajennusta) käyttäen List on lyhennysmerkintä tyyppilausekkeelle λα : µβ null = (), notnull = (α, β) Muodollinen määritelmä kielelle Systeemi F ω (joka on Systeemi F laajennettuna tyyppioperaattoreilla) on seuraavanlainen: α, β, γ TypeVariables x, y, z Variables K Kinds K ::= tavallisten tyyppien luonne K 1 K 2 tyyppioperaattorien luonne T, U Types T, U ::= α tyyppimuuttuja T U funktiotyyppi α : K T universaalityyppi T U operaattoriapplikaatio λα : K T operaattoriabstraktio t, u Terms t, u ::= x muuttuja tu (termi)applikaatio λx : T t (termi)abstraktio t T tyyppiapplikaatio λα : K t tyyppiabstraktio

7 15.4. TYYPPIOPERAATTORIT 161 Laskentasääntöjä varten tarvitaan myös arvojen ja selkärankojen määrittely: v Values v ::= w λx : T v λα : K v w Spines w x wv (15.13) Tyyppiyhtäläisyyden säännöt sisältävät tyyppien α- ja β-sievennyssäännöt: T T U T T U (15.14) (15.15) T 1 T 2 T 2 T 3 T 1 T 3 (15.16) T 1 U 1 T 2 U 2 T 1 T 2 U 1 U 2 (15.17) T[α := γ] U[β := γ] α : K T β : K U T[α := γ] U[β := γ] λα : K T λβ : K U γ uusi (15.18) γ uusi (15.19) T 1 U 1 T 2 U 2 T 1 T 2 U 1 U 2 (15.20) (λα : K T) U T[α := U] (15.21) Luonnejärjestelmä on yksinkertaisesti tyypitetty: Γ, α : K α : K (15.22) Γ T : K 1 K 2 Γ U : K 1 Γ T U : K 2 (15.23) Γ, α : K 1 T : K 2 Γ (λα : K 1 T) : K 1 K 2 (15.24) Γ T : Γ U : Γ T U : Γ, α : K T : Γ ( α : K T) : (15.25) (15.26)

8 162 LUKU 15. PARAMETRIPOLYMORFISMI Termien laskusäännöt eivät kovin paljoa eroa Systeemi F:n vastaavista: (λx : T t) u t[x := u] (15.27) (λα : K t) T t[α := T] t t tu t u u u tu t u (15.28) (15.29) (15.30) t t λx : T t λx : T t (15.31) t t t T t T (15.32) t t λα : K t λα : K t (15.33) Tyypityssäännöissä on pieniä muutoksia. Mainittakoon, että tyyppiympäristö sisältää termimuuttuja tyyppi-parien lisäksi myös tyyppimuuttuja luonne-pareja. Nyt voidaan lausua lambda-kielen tavanomaiset säännöt, joissa ei ole muutoksia: Γ, x : T x : T (15.34) Γ t : T 1 T 2 Γ u : U T 1 U Γ t u : T 2 (15.35) Γ, x : T u : U Γ (λx : T u) : U Ja lopuksi tyyppiapplikaation ja -abstraktion säännöt: Γ t : α : K T Γ U : K Γ t U : T[α := U] Γ, α : K t : T Γ λα : K t : α : K T (15.36) (15.37) (x,u) Γ : α FV(U) (15.38) Systeemi F ω :ssa (tarpeen mukaan laajennettuna ja ekvirekursiota nou-

9 15.4. TYYPPIOPERAATTORIT 163 dattaen) on mahdollista viimeinkin käyttää tyyppiturvallisia säiliöitä: List = λα : µβ null = (), notnull = (α, β) map = λα : λg : α α µ f : List α List α λl : List α case l of null = x null = () notnull = x let (a, r) = x in notnull = (g a, f r) Näillä lyhennysmerkinnöillä onkin mahdollista kirjoittaa map Num (λx : Num x + 1), joka sievenee funktioksi, jonka tyyppi on List Num List Num ja joka lisää jokaiseen lukulistan alkioon ykkösen.

10 164 LUKU 15. PARAMETRIPOLYMORFISMI

11 Luku 16 Alityypitys Staattisesti tyypitetyissä oliokielissä on tyypillistä, että tyyppien välillä on osittaisjärjestys (joskus jopa hila), jota kutsutaan alityypitykseksi (engl. subtyping) 1. Oliokielissä tyypillistä on, että tyyppi T on tyypin U alityyppi, merkitään T <: U, jos T on johdettu U:sta perimällä suoraan tai välillisesti. Joskus myös asetetaan alityypityssuhde lukutyyppien välille; kokonaislukutyyppi olisi rationaalilukujen tyypin alityyppi. Alityypitystä voi esiintyä myös muissa kuin oliokielissä. Alityypityksen periaatteellinen määritelmä on subsumptioperiaate: Jos (ja vain jos) T on U:n alityyppi, niin jokainen T:n lauseke kelpaa U:n lausekkeeksi. Lukemalla tätä periaatetta vasemmalta oikealle saadaan tyypityksen subsumptiosääntö: Γ t : T T <: U (16.1) Γ t : U Käytännössä subsumptioperiaatteen toteutuminen vaatii joko, että (a) tyypillä ja sen kaikilla alityypeillä on yhteensopiva binäärirajapinta muun muassa yhteensopiva koko tai että (b) subsumptiosäännön soveltaminen johtaa pakotukseen (engl. coercion) eli implisiittiseen tyyppimuunnokseen. Tyypillisesti (a) on toteutettavissa vain siten, että kaikki alityypittyvät tyypit ovat laatikoituja (engl. boxed) eli tyypin arvo on osoitin varsinaiseen dataolioon ilman, että osoitin näkyy käyttäjälle. Oliokielissä yleensä, kuten esimerkiksi Javassa, alityypittyvät tyypit (luokkatyypit Javassa) ovat kaikki laatikoituja (eli viitetyyppejä). Tapa (b) on harvinaisempi sitä käytetään lähinnä lukutyyppien kanssa, sillä lukutyyppien laatikoiminen hi- 1 Sitä kutsutaan usein myös perinnäksi (engl. inheritance), vaikka perintä varsinaisesti tarkoittaa luokan laajentamista. 165

12 166 LUKU 16. ALITYYPITYS dastaa ohjelman suoritusta kohtuuttomasti. C++ on tässä suhteessa poikkeuksellinen kieli, se nimittäin käyttää molempia tapoja: tapa (a) on käytössä osoitintyyppien (T ) ja viitetyyppien (T&) kanssa, ja tapa (b) on käytössä suorien oliotyyppien kanssa. Tässä luvussa tarkastellaan subsumptioperiaatteen seurauksia eri tilanteissa. Luvun päälähde on Pierce (2002, luku 15) Alityypitys on osittaisjärjestys Subsumptioperiaatteesta seuraa suoraan, että alityypitysrelaatio on refleksiivinen: T <: T (16.2) Jos T 1 <: T 2 ja t : T 1 pätevät, niin subsumptiosäännön mukaan t : T 2 pätee. Jos lisäksi T 2 <: T 3 pätee, niin subsumptiosäännöstä seuraa suoraan, että t : T 3 pätee. Näin ollen T 1 <: T 3 pätee. Alityypitysrelaatio on siis transitiivinen: T 1 <: T 2 T 2 <: T 3 T 1 <: T 3 (16.3) Mikäli T <: U ja U <: T ovat molemmat voimassa, ovat väitteet t : T ja t : U ekvivalentit. On siis luontevaa määritellä, että kaksi tyyppiä ovat samat, jos niihin kuuluu samat termit; tämän ns. ekstensionaalisen tyyppiyhtäläisyyden voimassa ollessa alityypitys on myös antisymmetrinen: T <: U U <: T T U Näin ollen alityypitys on luonteeltaan osittaisjärjestys. (16.4) 16.2 Tietueiden alityypitys Ehkäpä selkein esimerkki alityypityksen toiminnasta saadaan seuraavasti. Tarkastellaan lauseketta (λx : { a : Num } x.a) { a = 1, b = 2 } Pohtimatta vielä tyypitystä lasketaanpa sen arvo: (λx : { a : Num } x.a) { a = 1, b = 2 } { a = 1, b = 2 }.a 1

13 16.3. FUNKTIOIDEN ALITYYPITYS 167 Lauseke ei siis jää jumiin, joten mitään tyyppivirhettä ei pitäisi olla, ja lausekkeen tyypin pitäisi olla Num. Kokeillaanpa tyypittää lauseke: x : { a : Num } x : { a : Num } x : { a : Num } x.a : Num { a = 1, b = 2 } : { a : Num } (λx : { a : Num } x.a) { a = 1, b = 2 } : Num Tyypitys ei onnistu, koska { a = 1, b = 2 } : { a : Num } ei päde yksinkertaisesti tyypitetyssä lambda-kielissä, johon on lisätty tietuetyyppi. Ongelma on ratkaistavissa ottamalla käyttöön subsumptiosääntö ja määrittelemällä, että tietuetyypin lopusta saadaan poistaa kenttiä vapaasti: { (l i : T i ) i=1 m } <: { (l i : T i ) i=1 n m n (16.5) } Huomaa, kuinka alityypissä on enemmän kenttiä kuin ylityypissä! Nyt edellä mainittu tyypitys onnistuu: x : { a : Num } x : { a : Num } x : { a : Num } x.a : Num { a = 1, b = 2 } : { a : Num, b : Num } { a : Num, b : Num } <: { a : Num } { a = 1, b = 2 } : { a : Num } (λx : { a : Num } x.a) { a = 1, b = 2 } : Num On myös mahdollista sallia kenttien alityypitys: ( T i <: U i ) n i=1 { (l i : T i ) n i=1 } <: { (l i : U i ) n i=1 } (16.6) Tietueiden kenttien unohtamissääntö (16.5) vaatii dynaamiselta toteutukselta joko, että säännön soveltaminen johtaa tietueen katkaisemiseen (käytännössä luomalla uusi tietueolio, jossa on vähemmän kenttiä, ja jonka kenttiin vanhan tietueolion kenttien arvot kopioidaan) taikka että tietueet ovat laatikoituja. Kenttien alityypitys (16.6) ei vaadi erityistä dynaamista tukea Funktioiden alityypitys Tarkastellaan funktiokutsua f a, missä funktion tyyppi on f : T U, argumentin tyyppi on a : T ja lauseketta käytetään tilanteessa, jossa vaaditaan tyyppiä U oleva lauseke. Toisin sanoen, f :n tulee kelvata tyyppiä T U olevaksi funktioksi. Ilmeistä on, että T :n tulee kelvata parametrityypiksi, eli pitää olla T <: T Toisaalta U:n pitää kelvata paluukontekstin tyypiksi, eli pitää olla U <: U. Yhteenvetona saadaan seuraavanlainen sääntö: T <: T U <: U T U <: T U (16.7)

14 168 LUKU 16. ALITYYPITYS Huomaa, kuinka alityypitysrelaatio on nurin päin argumenttityyppien kohdalla, kun taas paluutyyppien kohdalla ei. Sanotaankin, että funktiotyyppi on kontravariantti argumentin suhteen ja kovariantti paluutyypin suhteen Top ja Bot Monissa kielissä on olemassa ylin tyyppi, yleensä nimeltään Object, joka on kaikkien tyyppien ylityyppi. Tyyppiteoriassa sitä kutsutaan nimellä Top (koska se on alityypityshilan supremum): T <: Top (16.8) Vastaavasti voidaan myös määritellä alin tyyppi, joka on kaikkien tyyppien alityyppi, Bot: Bot <: T (16.9) Tämän tyypin erikoisuutena on, että siihen ei sisälly yhtään arvoa. Näin ollen se vastaa aiemmin esiteltyä noreturn-tyyppiä Eksplisiittiset tyyppimuunnokset Joskus, lähinnä dokumentaatio- ja debuggaustarkoituksissa, voi olla tarpeen kirjoittaa ohjelman sisään sellaisia tyyppiannotaatiota, jotka eivät ole tyyppijärjestelmän kannalta tarpeen. Laajennetaan lambda-kieltä tällaisella operaattorilla: t, u ::= t :: T Laskenta yksinkertaisesti jättää tällaisen annotaation huomiotta: (t :: T) t (16.10) Tyyppijärjestelmä huolehtii siitä, että tällainen huomiotta jättäminen on mahdollista: Γ t : T T <: T Γ (t :: T) : T (16.11)

15 16.6. MUUTTUVAISET 169 Näin määriteltynä kyseessä on niin sanottu upcast, joka lähinnä dokumentoi lausekkeen tyypin (tarvittaessa unohtaen lausekkeen aiemman tyypin, jos se on dokumentoidun tyypin alityyppi). Usein on toisaalta tarvetta downcastaukseen eli ylityypin muuttamiseen alityypiksi. Sellainen operaatio voi epäonnistua, sillä kyse on ohjelmoijan eksplisiittisestä käskystä ohittaa tyyppijärjestelmä kontrolloidusti. Esimerkiksi Javassa operaatio (T)t, jos t:n staattinen tyyppi on T:n ylityyppi, heittää poikkeuksen, jos t:n dynaaminen tyyppi ei ole T:n alityyppi ohjelmoija voi tämän tarkistaa etukäteen käyttämällä instanceof-operaattoria. Lambda-kieleen vastaava on luonnollisinta tuoda käyttämällä case-lauseketta: t, u ::= case t of ( x i :: T i t i ) + i v : T T <: T 1 case v of ( x i :: T i t i ) n i=1 t 1[x 1 := v] (16.12) (16.13) v : T T <: T 1 case v of ( x i :: T i t i ) i=1 n case v of ( x i :: T i t i ) i=2 n n 2 (16.14) t t case t of ( x i :: T i t i ) i=1 n case t of ( x i :: T i t i ) i=1 n (16.15) Γ t : T ( T i <: T ) n i=1 T <: T n Γ, ( x i t i : U) n i=1 Γ (case t of x 1 :: T 1 t 1 x n :: T n t n ) : U (16.16) Huomaa, kuinka tyyppisääntö (16.16) vaatii, että viimeinen tyyppi on t:n oma tyyppi näin viimeinen vaihtoehto toimii jokerina Muuttuvaiset Kaikenlaiset tyypit, jotka kelpaavat sijoituslauseen vasemmalle puolelle esimerkiksi osoitintyypit ovat alityypityksen kannalta hankalia. Tarkastellaan osoitintyyppiä T. Jos sen tyyppistä lauseketta t : T käytetään tähtäysoperaattorissa, joka vaatii tyyppiä U olevan arvon, pitää päteä T <: U. Toisaalta tällöin tähtäysoperaattorin tyyppi on T, joten pitää päteä T <: U. Jos t:tä käytetään sijoituslauseen vasemmalla puolella, ja oikealla puolella on U-tyyppiä oleva lauseke. täytyy toki päteä T <: U ; toisaalta nyt minkä tahansa U-tyyppisen arvon tulee kelvata T-tyyppiseksi arvoksi, joten T <: U pätee. Näin ollen osoitintyyppi on alityypityksen suhteen invariantti: T <: U U <: T T <: U (16.17)

16 170 LUKU 16. ALITYYPITYS Huomaa argumentaation laatu: jos tyypin lauseke on vastaanottaja (esimerkiksi sijoituslauseen vasen puoli taikka funktion argumentti), on alityypitys kontravarianttia, ja jos tyypin lauseke on lähettäjä (useimmat muut), on alityypitys kovarianttia. Koska osoitintyyppiä oleva arvo voi toimia sekä lähettäjänä että vastaanottajana, on osoitintyyppi sekä kovariantti että kontravariantti eli siis invariantti This-tyyppi Aiemmin tässä monisteessa käsiteltiin binäärimetodien ongelmaa (luku 9.6). Yksi ratkaisu ongelmaan on erillisen this-tyypin ottaminen mukaan kieleen. This-tyyppiä käytettäisiin metodin parametrin tyyppinä tarkoittamaan metodin itseviittauksen dynaamista tyyppiä. Näin laajennetussa Javakielessä voitaisiin equals-metodi kirjoittaa seuraavasti: public class Object {... public boolean equals(this other) { return this == other }... } Tämä kuitenkin rikkoo alityypityksen! Tämä Object.equals-metodi on tyypiltään Object boolean. Objectluokasta peritään luokka String; Javan perintärelaatio on samalla alityypitysrelaatio, joten pätee String <: Object. Nyt String.equals-metodi on tyypiltään String boolean. Koska funktiot ovat parametrinsa suhteen kontravariantteja, voi String <: Object päteä vain, jos String ja Object ovat sama tyyppi, mitä ne eivät ole! Tässä on ristiriita. Bruce et al. (1995) ehdottavat ratkaisuksi mallia, jossa alityypityksestä oliokielessä luovutaan ja se korvataan rajoitetulla parametripolymorfismilla. Tällöin Object.equals olisikin tyypiltään α <# Object α boolean, missä <# on alityypitysrelaatiota rajoitetumpi tyyppien yhteensopivuutta ilmaiseva relaatio, matching. Tällöin yllä ehdotettu This-tyyppi on lyhennysmerkintä tällaiselle parametrisoinnille.

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

Alityypitys. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos Alityypitys TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 5. maaliskuuta 2007 Muistatko tietueet? {I 1 = E 1,..., I n = E n } : {I

Lisätiedot

TIES542 kevät 2009 Rekursiiviset tyypit

TIES542 kevät 2009 Rekursiiviset tyypit TIES542 kevät 2009 Rekursiiviset tyypit Antti-Juhani Kaijanaho 17. helmikuuta 2009 Edellisessä monisteessa esitetyt tietue- ja varianttityypit eivät yksinään riitä kovin mielenkiintoisten tietorakenteiden

Lisätiedot

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

Geneeriset tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos Geneeriset tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 6. maaliskuuta 2007 Kysymys Mitä yhteistä on seuraavilla funktioilla?

Lisätiedot

14.1 Rekursio tyypitetyssä lambda-kielessä

14.1 Rekursio tyypitetyssä lambda-kielessä Luku 14 Rekursiiviset tyypit Edellisessä luvussa esitetyt tietue- ja varianttityypit eivät yksinään riitä kovin mielenkiintoisten tietorakenteiden toteuttamiseen. Useimmissa ohjelmissa tarvitaan erilaisia

Lisätiedot

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

Oliot ja tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos Oliot ja tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 19. maaliskuuta 2007 Olion tyyppi? attribuutti on oikeastaan metodi,

Lisätiedot

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

lausekkeiden tapauksessa. Jotkin ohjelmointikielet on määritelty sellaisiksi, 3.5. TYYPIT 59 indeksit voidaan siirtää kielitasolta oliotasolle siirryttäessä alkamaan nollasta. Vain mikäli indeksin alin arvo oliotasolla ei ole tiedossa ennen suorituksen alkua, on tarpeen lisätä taulukko-olioon

Lisätiedot

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

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla 2.5. YDIN-HASKELL 19 tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla kirjaimilla. Jos Γ ja ovat tyyppilausekkeita, niin Γ on tyyppilauseke. Nuoli kirjoitetaan koneella

Lisätiedot

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia Antti-Juhani Kaijanaho 16. helmikuuta 2009 Tyypitetyt ohjelmointikielet sisältävät paljon muitakin konstruktioita kuin yksinkertaisesti tyypitetyn lambda-kielen,

Lisätiedot

Ydin-Haskell Tiivismoniste

Ydin-Haskell Tiivismoniste Ydin-Haskell Tiivismoniste Antti-Juhani Kaijanaho 8. joulukuuta 2005 1 Abstrakti syntaksi Päätesymbolit: Muuttujat a, b, c,..., x, y, z,... Tyyppimuuttujat α, β, γ,... Koostimet (data- ja tyyppi-) C, D,...,

Lisätiedot

Haskell ohjelmointikielen tyyppijärjestelmä

Haskell ohjelmointikielen tyyppijärjestelmä Haskell ohjelmointikielen tyyppijärjestelmä Sakari Jokinen Helsinki 19. huhtikuuta 2004 Ohjelmointikielten perusteet - seminaarityö HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos 1 Johdanto 1 Tyyppien

Lisätiedot

Staattinen tyyppijärjestelmä

Staattinen tyyppijärjestelmä Luku 12 Staattinen tyyppijärjestelmä [Staattinen t]yyppijärjestelmä on ratkeava, kieliopillinen menetelmä, jota käytetään todistamaan tiettyjen käytösten puuttuminen ohjelmasta luokittelemalla ilmaisuja

Lisätiedot

12. Monimuotoisuus 12.1

12. Monimuotoisuus 12.1 12. Monimuotoisuus 12.1 Sisällys Johdanto. Periytymismekanismi määrittää alityypityksen. Viitteiden sijoitus ja vertailu. Staattinen ja dynaaminen luokka. Myöhäinen ja aikainen sidonta. Parametrinvälitys

Lisätiedot

12. Monimuotoisuus 12.1

12. Monimuotoisuus 12.1 12. Monimuotoisuus 12.1 Sisällys Johdanto. Periytymismekanismi määrittää alityypityksen. Viitteiden sijoitus ja vertailu. Staattinen ja dynaaminen luokka. Parametrinvälitys eräs monimuotoisuuden sovellus.

Lisätiedot

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

semantiikasta TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho 5. lokakuuta 2009 TIETOTEKNIIKAN LAITOS Ohjelmointikielten staattisesta TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 5. lokakuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe B tiistai 6.10. klo 10 selaaja ja jäsentäjä toimivat Vaihe

Lisätiedot

TIES542 kevät 2009 Tyyppiteorian alkeet

TIES542 kevät 2009 Tyyppiteorian alkeet TIES542 kevät 2009 Tyyppiteorian alkeet Antti-Juhani Kaijanaho 9. helmikuuta 2009 [Staattinen t]yyppijärjestelmä on ratkeava, kieliopillinen menetelmä, jota käytetään todistamaan tiettyjen käytösten puuttuminen

Lisätiedot

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

Laajennetaan vielä Ydin-Haskellia ymmärtämään vakiomäärittelyt. Määrittely on muotoa 2.6. TIETOKONE LASKIMENA 23 Edellä esitetty Ydin-Haskell on hyvin lähellä sitä kieltä, jota GHCi (Glasgow Haskell Compiler, Interactive) sekä muut Haskell-järjestelmät suostuvat ymmärtämään. Esimerkiksi:

Lisätiedot

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

2.4 Normaalimuoto, pohja ja laskentajärjestys 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13 Toisinaan voi olla syytä kirjoittaa α- tai β-kirjain yhtäsuuruusmerkin yläpuolelle kertomaan, mitä muunnosta käytetään. Esimerkki 4 1. (λx.x)y β = y 2.

Lisätiedot

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

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 26. kesäkuuta 2013 ja ja TIEA241 Automaatit ja kieliopit, kesä 2012 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 26. kesäkuuta 2013 Sisällys ja ja on yksi vanhimmista tavoista yrittää mallittaa mekaanista laskentaa. Kurt

Lisätiedot

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006 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 :

Lisätiedot

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

sama tyyppi (joka vastaa kaikkien mahdollisten arvojen summa-aluetta). Esimerkiksi 3.5. TYYPIT 51 3.5.3 Kielitason tyypit Staattinen tyypitys Kielitasolla tyyppejä käytetään sulkemaan pois joitakin merkittäviä ja automaattisesti tunnistettavissa olevia merkitysopillisia virheitä (oliotason

Lisätiedot

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Tällä luennolla Algebralliset tietotyypit Hahmonsovitus (pattern matching) Primitiivirekursio Esimerkkinä binäärinen hakupuu Muistattehan...

Lisätiedot

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

Demo 7 ( ) Antti-Juhani Kaijanaho. 9. joulukuuta 2005 Demo 7 (14.12.2005) Antti-Juhani Kaijanaho 9. joulukuuta 2005 Liitteenä muutama esimerkki Ydin-Haskell-laskuista. Seuraavassa on enemmän kuin 12 nimellistä tehtävää; ylimääräiset ovat bonustehtäviä, joilla

Lisätiedot

ELM GROUP 04. Teemu Laakso Henrik Talarmo

ELM GROUP 04. Teemu Laakso Henrik Talarmo ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA34 Funktio-ohjelmointi, kevät 2008 Luento 3 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 2. tammikuuta 2008 Ydin-Haskell: Syntaksi Lausekkeita (e) ovat: nimettömät funktiot: \x

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien

Lisätiedot

TIES542 kevät 2009 Oliokielten erityiskysymyksiä

TIES542 kevät 2009 Oliokielten erityiskysymyksiä TIES542 kevät 2009 Oliokielten erityiskysymyksiä Antti-Juhani Kaijanaho 16. maaliskuuta 2009 1 Moniperinnän ongelma Luku perustuu lähteeseen Ducasse et al. (2006). Perinnällä on olio-ohjelmoinnissa useita

Lisätiedot

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

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006 Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet TIES341 Funktio-ohjelmointi 2 Kevät 2006 Alkuperäislähteitä Philip Wadler & Stephen Blott: How to make ad-hoc polymorphism less ad-hoc,

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Geneerinen ohjelmointi. Lueteltu tyyppi enum. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien silmukoimiseen:

Lisätiedot

11/20: Konepelti auki

11/20: Konepelti auki Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon

Lisätiedot

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Lisää laskentoa TIEA341 Funktio ohjelmointi 1 Syksy 2005 Kertausta: Laajennettu aritmetiikka Lasketaan rationaaliluvuilla vakiot yhteen, vähennys, kerto ja jakolasku Laajennetaan sitä määrittelyillä: vakio

Lisätiedot

Yksinkertaiset tyypit

Yksinkertaiset tyypit Yksinkertaiset tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 13. helmikuuta 2007 Tyypitön puhdas λ-laskento E ::= I E 1 E 2

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 14: Monadit Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 Tyyppien tyypit eli luonteet engl. kind tyyppinimet, kuten

Lisätiedot

Groovy. Niko Jäntti Jesper Haapalinna Group 31

Groovy. Niko Jäntti Jesper Haapalinna Group 31 Groovy Niko Jäntti Jesper Haapalinna Group 31 Johdanto Groovy on Apachen kehittämä Javaan perustuva dynaaminen oliopohjainen ohjelmointikieli. Kielen kehitys alkoi vuonna 2003, versio 1.0 julkaistiin 2007

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 2: SICP kohdat 22.2.3 Riku Saikkonen 2. 11. 2010 Sisältö 1 Linkitetyt listat 2 Listaoperaatioita 3 Listarakenteet 4 Gambit-C:n Scheme-debuggeri Linkitetyt

Lisätiedot

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

Tämän vuoksi kannattaa ottaa käytännöksi aina kirjoittaa uuden funktion tyyppi näkyviin, ennen kuin alkaa sen määritemää kirjoittamaan. 3.1. LISTAT 35 destaan pisteittäisesti: init :: [α] [α] init (x : []) = [] init (x : xs) = x : init xs Varuskirjastoon kuuluu myös funktiot take ja drop, jotka ottavat tai tiputtavat pois, funktiosta riippuen,

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015 TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 30. marraskuuta 2015 Sisällys t Väitöstilaisuus 4.12.2015 kello 12 vanhassa juhlasalissa S212 saa tulla 2 demoruksia

Lisätiedot

Rekursiiviset tyypit

Rekursiiviset tyypit Rekursiiviset tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 20. helmikuuta 2007 Hiloista Kiintopisteet (Ko)rekursio Rekursiiviset

Lisätiedot

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

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU Ohjelmointi 2 Jussi Pohjolainen TAMK» Tieto- ja viestintäteknologia Tietotyypeistä C++ - kielessä useita tietotyyppejä Kirjaimet: char, wchar_t Kokonaisluvut: short, int, long Liukuluvut: float, double

Lisätiedot

TIES542 kevät 2009 Oliokielten erityispiirteitä

TIES542 kevät 2009 Oliokielten erityispiirteitä TIES542 kevät 2009 Oliokielten erityispiirteitä Antti-Juhani Kaijanaho 2. maaliskuuta 2009 Oliosuuntautuneisuus (engl. object-orientation) ja olio-ohjelmointi (engl. objectoriented programming) ovat laajassa

Lisätiedot

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

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009 TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 27. lokakuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe D tiistai 10.11. klo 10 välikielen generointi Kääntäjän rakenne

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Keskeneräinen luento 3: Listat (mm. SICP 22.2.3) Riku Saikkonen 31. 10. 2011 Sisältö 1 Linkitetyt listat 2 Linkitetyt listat (SICP 2.1.1, 2.2.1) funktionaalinen

Lisätiedot

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet Koka Ryhmä 11 Juuso Tapaninen, Akseli Karvinen 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet 1 1. Taustoja Koka on Daan Leijenin ja Microsoft:n kehittämä

Lisätiedot

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

Uusi näkökulma. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Uusi näkökulma TIEA341 Funktio ohjelmointi 1 Syksy 2005 Aloitetaan alusta... Otetaan uusi näkökulma Haskelliin ohjelmointi laskentana kertausta toisaalta, uusia käsitteitä toisaalta helpottanee sitten

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 6 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/

Lisätiedot

815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset

815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset 815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/

Lisätiedot

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 16. toukokuuta 2011

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 16. toukokuuta 2011 TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 16. toukokuuta 2011 Sisällys engl. random-access machines, RAM yksinkertaistettu nykyaikaisen (ei-rinnakkaisen)

Lisätiedot

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.

Lisätiedot

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

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus

Lisätiedot

7/20: Paketti kasassa ensimmäistä kertaa

7/20: Paketti kasassa ensimmäistä kertaa Ohjelmointi 1 / syksy 2007 7/20: Paketti kasassa ensimmäistä kertaa Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007

Lisätiedot

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2 Johdatus diskreettiin matematiikkaan Harjoitus 4, 7.10.2015 1. Olkoot c 0, c 1 R siten, että polynomilla r 2 c 1 r c 0 on kaksinkertainen juuri. Määritä rekursioyhtälön x n+2 = c 1 x n+1 + c 0 x n, n N,

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 10 Todistamisesta Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 Samuuden todistaminen usein onnistuu ihan laskemalla

Lisätiedot

Tietotekniikan valintakoe

Tietotekniikan valintakoe Jyväskylän yliopisto Tietotekniikan laitos Tietotekniikan valintakoe 2..22 Vastaa kahteen seuraavista kolmesta tehtävästä. Kukin tehtävä arvostellaan kokonaislukuasteikolla - 25. Jos vastaat useampaan

Lisätiedot

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

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A. Tehtävä. Tämä tehtävä on aineistotehtävä, jossa esitetään ensin tehtävän teoria. Sen jälkeen esitetään neljä kysymystä, joissa tätä teoriaa pitää soveltaa. Mitään aikaisempaa tehtävän aihepiirin tuntemusta

Lisätiedot

Luku 2. Ohjelmointi laskentana. 2.1 Laskento

Luku 2. Ohjelmointi laskentana. 2.1 Laskento Luku 2 Ohjelmointi laskentana Funktio-ohjelmoinnin, olio-ohjelmoinnin ja käskyohjelmoinnin ero on löydettävissä niiden pohjalla olevista laskennan mallista. Automaattisen tietojenkäsittelyn yksi historiallinen

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, tietorakenteen muuttaminen (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 6. 11. 2012 Sisältö 1 Muuttujan arvon muuttaminen:

Lisätiedot

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

T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010 12. Periytyminen Johdantoa Käytännössä vähänkään laajemmissa ohjelmissa joudutaan laatimaan useita luokkia, joiden pitäisi pystyä välittämään tietoa toisilleen. Ohjelmien ylläpidon kannalta olisi lisäksi

Lisätiedot

Lisää pysähtymisaiheisia ongelmia

Lisää pysähtymisaiheisia ongelmia Lisää pysähtymisaiheisia ongelmia Lause: Pysähtymättömyysongelma H missä H = { w111x w validi koodi, M w ei pysähdy syötteellä x } ei ole rekursiivisesti lueteltava. Todistus: Pysähtymisongelman komplementti

Lisätiedot

Rekursiiviset tyypit - teoria

Rekursiiviset tyypit - teoria Rekursiiviset tyypit - teoria Samppa Saarela Helsinki 1999/04/14 Tyyppiteoria ja ohjelmointikielet - seminaari HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Sisältö i 1 Johdanto 1 2 Esimerkkkejä

Lisätiedot

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

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Tyyppejä ja vähän muutakin TIEA341 Funktio ohjelmointi 1 Syksy 2005 Viime luennolla... Haskellin alkeita pääasiassa Hello World!... ja muita tutunoloisia ohjelmia Haskellilla Haskellin voima on kuitenkin

Lisätiedot

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli TIE-20306 PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli Seminaariesitelmä ryhmä 24 Markku Ahokas Jani Kuitti i SISÄLLYSLUETTELO 1. YLEISTÄ EIFFELISTÄ... 1 1.1 Historia ja tausta... 1 1.2

Lisätiedot

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages Tampere University of Technology Department of Pervasive Computing TIE-20306 Principles of Programming Languages Ruby Ryhmä 8 Juho Rintala Sami Paukku Sisällysluettelo 1 Johdanto... 3 2 Paradigma... 3

Lisätiedot

11.4. Context-free kielet 1 / 17

11.4. Context-free kielet 1 / 17 11.4. Context-free kielet 1 / 17 Määritelmä Tyypin 2 kielioppi (lauseyhteysvapaa, context free): jos jokainenp :n sääntö on muotoa A w, missäa V \V T jaw V. Context-free kielet ja kieliopit ovat tärkeitä

Lisätiedot

Luku 3. Listankäsittelyä. 3.1 Listat

Luku 3. Listankäsittelyä. 3.1 Listat Luku 3 Listankäsittelyä Funktio-ohjelmoinnin tärkein yksittäinen tietorakenne on lista. Listankäsittely on paitsi käytännöllisesti oleellinen aihe, se myös valaisee funktio-ohjelmoinnin ideaa. 3.1 Listat

Lisätiedot

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 V Abstraktit tietotyypit ja olioohjelmointi Sisältö I. Abstraktit tietotyypit II. 1. Johdatus abstrakteihin tietotyyppeihin 2. Abstraktit tietotyypit Adassa

Lisätiedot

Javan perusteita. Janne Käki

Javan perusteita. Janne Käki Javan perusteita Janne Käki 20.9.2006 Muutama perusasia Tietokone tekee juuri (ja vain) sen, mitä käsketään. Tietokone ymmärtää vain syntaksia (sanojen kirjoitusasua), ei semantiikkaa (sanojen merkitystä).

Lisätiedot

TIES542 kevät 2009 Aliohjelmien formalisointia lambda-kieli

TIES542 kevät 2009 Aliohjelmien formalisointia lambda-kieli TIES542 kevät 2009 Aliohjelmien formalisointia lambda-kieli Antti-Juhani Kaijanaho 3. helmikuuta 2009 Lambda-kielen taustalla on 1900-luvun alkuvuosikymmenien matematiikan perusteiden tutkimus ja siihen

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Ilmentymämetodien korvaaminen. Luokkametodien peittäminen. Super-attribuutti. Override-annotaatio.

Lisätiedot

Matematiikan tukikurssi

Matematiikan tukikurssi Matematiikan tukikurssi Kurssikerta 1 Määrittelyjoukoista Tarkastellaan funktiota, jonka määrittelevä yhtälö on f(x) = x. Jos funktion lähtöjoukoksi määrittelee vaikkapa suljetun välin [0, 1], on funktio

Lisätiedot

Matematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista

Matematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista Matematiikan johdantokurssi, syksy 06 Harjoitus, ratkaisuista. Valitse seuraaville säännöille mahdollisimman laajat lähtöjoukot ja sopivat maalijoukot niin, että syntyy kahden muuttujan funktiot (ks. monisteen

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 4 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 17. tammikuuta 2008 Modulin viimeistelyä module Shape ( Shape ( Rectangle, E l l i p

Lisätiedot

Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita!

Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita! Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita! eli... Hyvä kaava sanoo enemmän kuin,... tuhat riviä koodia!... sata riviä tekstiä!... kymmenen diagrammia! Sopimusohjelmointi

Lisätiedot

4. Olio-ohjelmoinista lyhyesti 4.1

4. Olio-ohjelmoinista lyhyesti 4.1 4. Olio-ohjelmoinista lyhyesti 4.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 4.2 Yleistä Olio-ohjelmointia käsitellään hyvin

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 11: Olioiden toteuttaminen Riku Saikkonen 28. 11. 2011 Sisältö 1 Miten oliot ja metodikutsut toimivat? 2 Oliot Minkä luokan metodia kutsutaan? Python-esimerkki

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero

Lisätiedot

Java kahdessa tunnissa. Jyry Suvilehto

Java kahdessa tunnissa. Jyry Suvilehto Java kahdessa tunnissa Jyry Suvilehto Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi,

Lisätiedot

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

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...

Lisätiedot

Insinöörimatematiikka A

Insinöörimatematiikka A Insinöörimatematiikka A Mika Hirvensalo mikhirve@utu.fi Matematiikan ja tilastotieteen laitos Turun yliopisto 2018 Mika Hirvensalo mikhirve@utu.fi Luentoruudut 3 1 of 23 Kertausta Määritelmä Predikaattilogiikan

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Tietorakenneluokkia 2: HashMap, TreeMap Tietorakenneluokkia ja -rajapintoja Java tarjoaa laajan kokoelman tietorakennerajapintoja ja - luokkia. Aiemmin

Lisätiedot

jäsentäminen TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 26. marraskuuta 2015 TIETOTEKNIIKAN LAITOS

jäsentäminen TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 26. marraskuuta 2015 TIETOTEKNIIKAN LAITOS TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 26. marraskuuta 2015 Sisällys Tunnistamis- ja jäsennysongelma Olkoon G = (N, Σ, P, S) kontekstiton kielioppi ja

Lisätiedot

Tietueet. Tietueiden määrittely

Tietueet. Tietueiden määrittely Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään

Lisätiedot

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19 Ohjelmointikieli TIE-20306 Principles of Programming Languages Syksy 2017 Ryhmä 19 Juho Kärnä Ville Mäntysaari 1. Johdanto D on yleiskäyttöinen, strukturoitu, staattisesti tyypitetty, käännettävä ohjelmointikieli

Lisätiedot

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

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen Sisällys 6. Metodit Oliot viestivät metodeja kutsuen. Kuormittaminen. Luokkametodit (ja -attribuutit).. Metodien ja muun luokan sisällön järjestäminen. 6.1 6.2 Oliot viestivät metodeja kutsuen Oliot viestivät

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

Lisätiedot

Logiikan kertausta. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos.

Logiikan kertausta. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos. TIE303 Formaalit menetelmät, kevät 2005 Logiikan kertausta Antti-Juhani Kaijanaho antkaij@mit.jyu.fi Jyväskylän yliopisto Tietotekniikan laitos TIE303 Formaalit mentetelmät, 2005-01-27 p. 1/17 Luento2Luentomoniste

Lisätiedot

4 Matemaattinen induktio

4 Matemaattinen induktio 4 Matemaattinen induktio Joidenkin väitteiden todistamiseksi pitää näyttää, että kaikilla luonnollisilla luvuilla on jokin ominaisuus P. Esimerkkejä tällaisista väitteistä ovat vaikkapa seuraavat: kaikilla

Lisätiedot

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

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet ) T-79144 Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet 11-22) 26 29102004 1 Ilmaise seuraavat lauseet predikaattilogiikalla: a) Jokin porteista on viallinen

Lisätiedot

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

Reaalilukuvälit, leikkaus ja unioni (1/2) Luvut Luonnolliset luvut N = {0, 1, 2, 3,... } Kokonaisluvut Z = {..., 2, 1, 0, 1, 2,... } Rationaaliluvut (jaksolliset desimaaliluvut) Q = {m/n m, n Z, n 0} Irrationaaliluvut eli jaksottomat desimaaliluvut

Lisätiedot

16. Javan omat luokat 16.1

16. Javan omat luokat 16.1 16. Javan omat luokat 16.1 Sisällys Johdanto. Object-luokka: tostring-, equals-, clone- ja getclass-metodit. Comparable-rajapinta: compareto-metodi. Vector- ja ArrayList-luokat. 16.2 Javan omat luokat

Lisätiedot

Olio-ohjelmointi Syntaksikokoelma

Olio-ohjelmointi Syntaksikokoelma C++-kielen uusia ominaisuuksia Olio-ohjelmointi Syntaksikokoelma 31.10.2008 Bool-tietotyyppi: Totuusarvo true (1), jos ehto on tosi ja false (0) jos ehto epätosi. Dynaaminen muistinvaraus: Yhden muuttuja

Lisätiedot

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien

Lisätiedot

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 6. Metodit 6.1 Sisällys Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 Oliot viestivät metodeja kutsuen Olio-ohjelmoinnissa ohjelma

Lisätiedot

815338A Ohjelmointikielten periaatteet 2014-2015

815338A Ohjelmointikielten periaatteet 2014-2015 815338A Ohjelmointikielten periaatteet 2014-2015 X Skriptiohjelmointi Sisältö 1. Johdanto 2. Skriptikielten yleispiirteitä 3. Python 815338A Ohjelmointikielten periaatteet, Skriptiohjelmointi 2 X.1 Johdanto

Lisätiedot

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.

Lisätiedot

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia. Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet String-merkkijonoluokka 1 Ohjelmointikielten merkkijonot Merkkijonot ja niiden käsittely on välttämätöntä ohjelmoinnissa Valitettavasti ohjelmointikielten tekijät eivät tätä ole ottaneet

Lisätiedot

Induktiota käyttäen voidaan todistaa luonnollisia lukuja koskevia väitteitä, jotka ovat muotoa. väite P(n) on totta kaikille n = 0,1,2,...

Induktiota käyttäen voidaan todistaa luonnollisia lukuja koskevia väitteitä, jotka ovat muotoa. väite P(n) on totta kaikille n = 0,1,2,... Induktiotodistus Induktiota käyttäen voidaan todistaa luonnollisia lukuja koskevia väitteitä, jotka ovat muotoa väite P(n) on totta kaikille n = 0,1,2,.... Tässä väite P(n) riippuu n:n arvosta. Todistuksessa

Lisätiedot

Dierentiaaliyhtälöistä

Dierentiaaliyhtälöistä Dierentiaaliyhtälöistä Markus Kettunen 4. maaliskuuta 2009 1 SISÄLTÖ 1 Sisältö 1 Dierentiaaliyhtälöistä 2 1.1 Johdanto................................. 2 1.2 Ratkaisun yksikäsitteisyydestä.....................

Lisätiedot

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

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä muuttujia ja vakioita. Esittely

Lisätiedot

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit Liite E - Esimerkkiprojekti E Esimerkkiprojekti Olet lukenut koko kirjan. Olet sulattanut kaiken tekstin, Nyt on aika soveltaa oppimiasi uusia asioita pienen, mutta täydellisesti muotoiltuun, projektiin.

Lisätiedot