Funktionaalinen ohjelmointi

Koko: px
Aloita esitys sivulta:

Download "Funktionaalinen ohjelmointi"

Transkriptio

1 hyväksymispäivä arvosana arvostelija Funktionaalinen ohjelmointi Eeva Terkki Helsinki HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

2 HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta Fakultet Faculty Laitos Institution Department Matemaattis-luonnontieteellinen tiedekunta Tekijä Författare Author Eeva Terkki Työn nimi Arbetets titel Title Tietojenkäsittelytieteen laitos Funktionaalinen ohjelmointi Oppiaine Läroämne Subject Tietojenkäsittelytiede Työn laji Arbetets art Level Aika Datum Month and year Sivumäärä Sidoantal Number of pages LuK-tutkielma sivua Tiivistelmä Referat Abstract Funktionaalinen ohjelmointi on matemaattisiin funktioihin perustuvaa ohjelmointia. Funktionaalisilla ohjelmointikielillä kirjoitetut ohjelmat rakentuvat funktioista, joita määritellään funktioiden avulla. Funktiot ovat usein rekursiivisesti määriteltyjä, ja funktioiden argumentteina ja arvoina voi olla funktioita. Puhdas funktionaalinen ohjelmointi on sivuvaikutuksetonta. Funktionaaliset ohjelmointikielet voivat olla dynaamisesti tai staattisesti tyypitettyjä ja joko applikatiivisessa järjestyksessä tai normaalijärjestyksessä evaluoituvia. Funktionaaliset ohjelmointikielet perustuvat lambdakalkyylin ideoihin. Esimerkkejä funktionaalisista kielistä ovat muun muassa Lisp, ML ja Haskell. Puhtaiden funktionaalisten ohjelmien etu on siinä, että ne toimivat aina odotetulla tavalla. Puhdas funktionaalinen ohjelmointi soveltuu sivuvaikutuksettomuuden ansiosta hyvin myös rinnakkaisohjelmointiin. Funktionaalisten ohjelmointikielten ongelmiin puolestaan lukeutuvat puutteelliset kehitystyökalut ja olemattomat rajapinnat muihin kieliin. ACM Computing Classification System (CCS): D.1.1 [Applicative (Functional) Programming] D.3.2 [Applicative (functional) languages] Avainsanat Nyckelord Keywords funktionaalinen ohjelmointi, funktionaaliset ohjelmointikielet, funktiot, evaluointi, tyyppijärjestelmät Säilytyspaikka Förvaringsställe Where deposited Muita tietoja övriga uppgifter Additional information

3 Sisältö ii 1 Johdanto 1 2 Funktionaalisten ohjelmointikielten piirteitä Sivuvaikutuksettomuus Evaluointi Tyypitys Funktiot Rekursio Listat Korkeamman kertaluvun funktiot Funktionaalisia ohjelmointikieliä Lisp ML Haskell Funktionaalisen ohjelmoinnin etuja ja ongelmia 16 6 Yhteenveto 17 Lähteet 19

4 1 Johdanto 1 Funktionaalinen ohjelmointi on ohjelmointiparadigma, jossa funktiot ovat keskeisessä asemassa. Funktioilla tarkoitetaan imperatiivisen ohjelmoinnin yhteydessä yleensä aliohjelmia. Funktionaalisessa ohjelmoinnissa funktio puolestaan tarkoittaa funktiota sanan matemaattisessa merkityksessä [Hin09, s. 87]: funktiot ovat sääntöjä, joiden mukaisesti lähtöjoukon arvot kuvautuvat maalijoukon arvoille. Samoja argumentteja käytettäessä funktion arvo on jokaisella kutsukerralla sama. Funktiot ovat funktionaalisessa ohjelmoinnissa ns. first-class-arvoja (first-class value) [Hud89, s. 382]. First-class-arvo tarkoittaa arvoa esimerkiksi kokonaislukua tai funktiota jonka voi sitoa muuttujaan ja jota voi käyttää parametrina ja paluuarvona. Funktionaalisessa ohjelmoinnissa funktioiden argumentteina ja arvoina voi siis olla funktioita. Funktiota, jonka argumenttina tai arvona on funktio, kutsutaan korkeamman kertaluvun funktioksi (higher order function) [Hud89, s. 382]. Imperatiivisessa ohjelmoinnissa muuttujien arvot tietyllä hetkellä muodostavat ohjelman senhetkisen tilan. Jonkin muuttujan arvon muuttuminen tarkoittaa siis muutosta ohjelman tilassa. Tilan muutosta kutsutaan sivuvaikutukseksi [Hud89, s. 361]. Puhtaassa funktionaalisessa ohjelmoinnissa tilaa ei ole, ja puhtaat funktionaaliset ohjelmointikielet ovat täysin sivuvaikutuksettomia. Funktiokutsun seurauksena ei siis voi tapahtua muuta kuin funktion arvon laskeminen [Hin09, s. 87]. Funktionaalisen ohjelmoinnin juuret ovat lambdakalkyylissa, joka on 1930-luvulla kehitetty matemaattinen laskennan malli [Chu41]. Lambdakalkyylin ideoihin perustuvia funktionaalisia ohjelmointikieliä ovat muun muassa Lisp, ML ja Haskell. Nykyisestä ohjelmistotuotannosta suurin osa tapahtuu edelleen perinteisillä imperatiivisilla ohjelmointikielillä, mutta funktionaaliset kielet ovat kasvattaneet suosiotaan paitsi tieteen myös liike-elämän sovelluksissa [Sco09, s. 505].

5 2 Funktionaalisten ohjelmointikielten piirteitä 2 Funktionaaliselle ohjelmoinnille ominainen piirre on sivuvaikutuksien välttäminen. Funktionaaliset kielet voivat olla joko täysin sivuvaikutuksettomia, tai ne voivat sallia imperatiivisen ohjelmoinnin piirteitä. Vastaavasti funktionaalisten ohjelmoinnin piirteitä esiintyy myös muita ohjelmointiparadigmoja edustavissa kielissä, kuten Pythonissa ja Rubyssa [Sco09, s. 536]. Tässä luvussa kerrotaan funktionaalisten ohjelmointikielten sivuvaikutuksettomuudesta ja tyyppijärjestelmistä sekä eri tavoista evaluoida funktioita. 2.1 Sivuvaikutuksettomuus Imperatiivisessa ohjelmoinnissa arvon sijoittaminen muuttujaan on paljon käytetty operaatio. Muuttujien arvot muodostavat ohjelman tilan kullakin hetkellä, ja tila muuttuu, kun johonkin muuttujista sidotaan uusi arvo. Tilan muuttumista kutsutaan sivuvaikutukseksi [Hud89, s. 361]. Puhdas funktionaalinen ohjelmointi on sivuvaikutuksetonta [Hin09, s. 87]. Siinä ei esiinny muuttujia, joiden arvoja voisi muuttaa, eikä muuttuvia tilojakaan siis ole. Muuttujaan voi sitoa arvon vain kerran, eikä sitä sen jälkeen voi enää muuttaa [Hug89, s. 98]. Kun funktiota kutsutaan, kutsusta voi seurata ainoastaan funktion arvon laskeminen ja lasketun arvon palauttaminen. Kun sivuvaikutuksia ei ole, voidaan olla varmoja siitä, että ohjelma toimii aina tietyllä tavalla [Sco09, s. 509]. Tietokoneohjelmiin liittyy kuitenkin paljon toimintoja, joiden yhteydessä sivuvaikutuksilta ei voida välttyä. Muun muassa syötteen lukeminen on toiminto, jota tarvitaan useissa ohjelmissa ja joka aiheuttaa luonnostaan sivuvaikutuksia [Sco09, s. 525]. Myös poikkeuksien yhteydessä esiintyy sivuvaikutuksia [Wad92, s. 1]. Eri funktionaaliset ohjelmointikielet käsittelevät sivuvaikutuksia

6 3 aiheuttavia toimintoja eri keinoin. Suurin osa funktionaalisista ohjelmointikielistä sallii imperatiivisen ohjelmoinnin piirteitä, kuten uusien arvojen sitomisen muuttujiin [Hin09, s. 88]. Näillä kielillä sivuvaikutuksia aiheuttavat toiminnot voidaan toteuttaa vastaavalla tavalla kuin imperatiivisilla ohjelmointikielillä. Tällöin ohjelmoija joutuu ohjelmoidessaan ottamaan huomioon sivuvaikutusten mahdollisesti aiheuttamat ongelmat. Imperatiivisten ohjelmointikielten piirteitä sallivia funktionaalisia ohjelmointikieliä ovat muun muassa Lisp [Hud89, s. 369] ja ML [Hud89, s. 374]. Funktionaalisen ohjelmointikielen sanotaan olevan puhdas (pure), jos siinä ei esiinny lainkaan sivuvaikutuksia. Myös puhtaalla funktionaalisella ohjelmointikielellä voidaan toteuttaa sivuvaikutuksia aiheuttavia toimintoja. Tällöin sivuvaikutukset sallitaan vain erityisissä ohjelmointikielen rakenteissa [Hin09, s. 88]. Esimerkiksi Haskell on puhdas funktionaalinen kieli [Sco09, s. 507]. 2.2 Evaluointi Jotta funktion arvo voidaan laskea, täytyy laskemisessa tarvittavat argumentit evaluoida, eli lausekkeiden arvot on laskettava ja funktiokutsut suoritettava. Argumentit voidaan evaluoida joko applikatiivisessa järjestyksessä (applicative-order) tai normaalijärjestyksessä (normal-order) [ASS96, s. 367]. Funktionaalisissa ohjelmointikielissä esiintyy kumpaakin evaluointitapaa. Applikatiivinen järjestys tarkoittaa, että kaikki funktion argumentit evaluoidaan täysin ennen kuin funktion arvoa aletaan laskea [ASS96, s. 367]. Applikatiivinen järjestys on käytössä esimerkiksi Lisp- ja ML-kielissä [Hud89, s. 384]. Seuraavassa esimerkissä nähdään, miten evaluointi tapahtuu applikatiivisessa järjestyksessä. Haskell-kielen syntaksilla kirjoitettu nelio-funktio laskee argumenttina saamansa luvun neliön:

7 4 nelio x = x * x Jos nelio-funktion arvo argumentilla (1 + 1) laskettaisiin käyttämällä evaluoinnissa applikatiivista järjestystä, evaluointi etenisi seuraavalla tavalla: nelio (1 + 1) => nelio 2 => 2 * 2 => 4 Ensin evaluoidaan funktion argumentti, minkä jälkeen funktion arvo lasketaan evaluoidun argumentin avulla. Normaalijärjestyksessä tapahtuvassa evaluoinnissa funktion argumentit evaluoidaan vasta silloin, kun argumenttien arvoja tarvitaan funktion arvon laskemisessa [ASS96, s. 367]. Argumentti jätetään kokonaan evaluoimatta, jos funktio ei käytä sitä mihinkään. Tällöin vältytään evaluoimasta mitään ylimääräistä, ja jos tarpeetonta evaluoitavaa on paljon, on evaluointi normaalijärjestyksessä tehokkaampaa kuin applikatiivisessa järjestyksessä [Hud89, s. 384]. Normaalijärjestyksessä evaluoimalla vältytään myös virhetilanteilta tapauksissa, joissa osa koodia sisältää virheitä, mutta kyseistä osaa ei koskaan tarvita funktion arvon laskemisessa [ASS96, s. 367]. Applikatiivisessa järjestyksessä evaluoitaessa myös tarpeeton, virheellinen osa evaluoitaisiin, jolloin kyseisen ohjelman suoritus päätyisi virhetilanteeseen. Yksinkertaisesti toteutettuna normaalijärjestyksessä evaluoiminen on kuitenkin monissa tapauksissa tehotonta verrattuna applikatiiviseen järjestykseen [Hud89, s. 383]. Sama lauseke nimittäin joudutaan evaluoimaan yhtä monta kertaa kuin sen arvoa käytetään funktion arvon laskemisessa. Yllä määritellyn nelio-funktion arvo argumentilla (1 + 1) saataisiin normaalijärjestyksessä evaluoimalla seuraavien vaiheiden kautta:

8 5 nelio (1 + 1) => (1 + 1) * (1 + 1) => 2 * (1 + 1) => 2 * 2 => 4 Argumentti (1 + 1) joudutaan evaluoimaan kahdesti, kun applikatiivisessa järjestyksessä evaluoitaessa sama argumentti oli tarpeen evaluoida vain kerran. Normaalijärjestyksessä evaluoinnin voi toteuttaa tehokkaammin käyttämällä laiskaa evaluointia (lazy evaluation) [Hud89, s. 384]. Laiskassa evaluoinnissa argumentit evaluoidaan vasta tarvittaessa, ja lisäksi kunkin argumentin evaluointi tapahtuu korkeintaan kerran [Hud89, s ]. Laiska evaluointitapa mahdollistaa äärettömän pituisten tietorakenteiden käsittelemisen [Sco09, s. 525]. Esimerkki laiskasti evaluoituvasta ohjelmointikielestä on Haskell, ja luvussa 3.2 nähdään, miten Haskell-kielellä voidaan käsitellä äärettömän pituisia listoja. 2.3 Tyypitys Funktionaalisten ohjelmointikielten joukkoon mahtuu sekä dynaamisesti että staattisesti tyypitettyjä kieliä. Dynaamisessa tyypityksessä ohjelman muuttujien ja funktioiden tyypit tarkistetaan suorituksen aikana [LTh09, s. 68]. Tällöin niiden tyyppejä ei tarvitse erikseen määritellä ohjelmakoodissa, mutta jos koodi sisältää tyyppivirheen, voi ohjelma kaatua kesken suorituksen. Staattisessa tyypityksessä tyypit tarkistetaan ohjelman kääntövaiheessa [LTh09, s. 68]. Tyyppivirheen jäädessä kääntäjän haaviin ohjelma ei käänny. Tämä varmistaa, että suorituksen aikana tyyppivirheitä ei esiinny. Staattisesti tyypitetyn ohjelman suorittaminen on nopeampaa kuin dynaamisesti tyypitetyn, sillä suorituksen aikana

9 6 ei tarvitse enää tehdä tyyppien tarkistuksia [LTh09, s. 70]. Staattisesti tyypitettyä ohjelmointikieltä käytettäessä ohjelman elementtien tyypit täytyy määritellä ohjelmakoodissa, paitsi jos käytettävä ohjelmointikieli käyttää tyypinpäättelyä (type inference) [LTh09, s. 70]. Tyypinpäättelyn ansiosta ohjelmoijan ei tarvitse kirjoittaa jokaisen muuttujan ja lausekkeen tyyppejä koodiin. Kielen kääntäjä päättelee oikeat tyypit koodin rakenteen ja siinä esiintyvien operaatioiden ja arvojen perusteella [Sco09, s. 316]. Siten se osaa odottaa oikean tyyppisiä arvoja kunkin funktion argumenteiksi ja arvoiksi, vaikka niitä ei olisi erikseen määritelty koodissa. 3 Funktiot Matemaattinen funktio on sääntö, jonka mukaisesti jokainen lähtöjoukon arvo kuvautuu jollekin maalijoukon arvolle. Samoilla argumenteilla funktio saa aina saman arvon [Hin09, s. 87]. Funktionaalisella ohjelmointikielellä kirjoitettu ohjelma koostuu funktioista: toisiinsa liitetyt yksinkertaiset funktiot muodostavat yhdessä monimutkaisempia kokonaisuuksia. Tämän luvun esimerkkifunktiot on kirjoitettu Haskellkielellä. 3.1 Rekursio Funktionaalinen ohjelmointi on pääosin sivuvaikutuksetonta, eikä siinä esiinny muuttujiin sijoittamista. Siksi funktionaalisessa ohjelmoinnissa ei voida käyttää imperatiiviselle ohjelmoinnille tyypillisiä toistorakenteita, kun jokin koodin osa halutaan toistaa monta kertaa [Hin09, s. 87]. Funktionaalisissa ohjelmointikielissä toisto toteutetaan käyttämällä rekursiota, sillä se on ainoa sivuvaikutukseton tapa suorittaa jokin toiminto monta kertaa [Sco09, s. 508].

10 7 Imperatiivisten kielten toistorakenteissa tilaa tyypillisesti muutetaan jokaisessa iteraatiossa, eli jokaisella toistokerralla yhden tai useamman muuttujan arvo muuttuu [Hin09, s ]. Rekursiivisessa toistossa jokaisessa funktiokutsussa yhdellä tai useammalla argumentilla on eri arvo kuin edellisessä funktiokutsussa. Rekursiivisesti määritelty funktio kutsuu itseään, kunnes jokin argumenteista täyttää tietyn ehdon ja rekursio päättyy. Seuraava funktio laskee n:nnen Fibonaccin luvun käyttämällä rekursiota: fibonacci 1 = 1 fibonacci 2 = 1 fibonacci n = fibonacci(n - 1) + fibonacci(n - 2) Funktiolla on kolmeen osaan jaettu määritelmä, jossa käytetään hahmonsovitusta (pattern matching). Hahmonsovituksessa funktion saamaa argumenttia verrataan eri argumenttivaihtoehtoihin [Hud89, s. 388]. Argumenttia sovitetaan järjestyksessä eri vaihtoehtoihin alkaen ylimmästä, ja argumentin mukaan määräytyy, mitä funktio tekee. Jos fibonacci-funktion argumenttina oleva luku on 1, lasketaan määritelmän ensimmäinen rivi, ja jos argumentti on 2, lasketaan toinen rivi. Molemmissa tapauksissa funktion arvoksi tulee luku 1. Jos argumenttina on jokin muu luku, lasketaan funktion määritelmän alin rivi, eli lasketaan yhteen kaksi edellistä Fibonaccin lukua. Kaksi edellistä Fibonaccin lukua saadaan kutsumalla fibonacci-funktiota argumenteilla (n - 1) ja (n - 2). Esimerkiksi neljännen Fibonaccin luvun laskeminen fibonacci-funktiolla tapahtuu seuraavien välivaiheiden kautta: fibonacci 4 fibonacci (4-1) + fibonacci (4-2) fibonacci 3 + fibonacci 2

11 8 (fibonacci (3-1) + fibonacci (3-2)) + fibonacci 2 (fibonacci 2 + fibonacci 1) + fibonacci 2 (1 + 1) Listat Listat ovat tärkeä tietorakenne funktionaalisessa ohjelmoinnissa, ja rekursio on hyödyllinen väline niiden läpikäymiseen [Sco09, s. 508]. Kun funktio käy listan rekursiivisesti läpi, se käsittelee listan yksi alkio kerrallaan. Tyypillisesti funktion argumenttina olevan listan ensimmäinen alkio käsitellään, ja funktio kutsuu itseään listan jäljelle jäävälle osalle. Sama toistuu, kunnes funktion argumenttina on tyhjä lista, eli lista on käyty kokonaan läpi. Seuraava funktio laskee äärellisen pituisen listan alkioiden summan rekursiivisesti: summa [] = 0 summa (x:xs) = x + summa xs Funktion määritelmässä tehdään hahmonsovitus listalle. Merkintä [] tarkoittaa tyhjää listaa ja merkintä (x:xs) vähintään yhden alkion sisältävää listaa. Jälkimmäisessä x on listan ensimmäinen alkio ja xs lopuista alkioista koostuva lista, joka voi olla myös tyhjä lista. Jos summa-funktion argumenttina on tyhjä lista, niin funktion arvo on nolla. Jos lista ei ole tyhjä, siirrytään hahmonsovituksessa seuraavaan funktion määritelmään, jolloin funktion arvo määräytyy summa-funktion määritelmän toisen rivin mukaisesti. Tällöin lasketaan yhteen listan ensimmäisen alkion arvo ja listan muiden alkioiden summa, joka saadaan laskettua kutsumalla summa-funktiota lopulle listasta. Funktion kutsumista argumenttina saadun listan loppuosalle jatketaan, kunnes argumen-

12 9 tiksi lopulta annetaan tyhjä lista ja rekursio päättyy. Laiskasti evaluoituvilla funktionaalisilla kielillä, kuten Haskellilla, on mahdollista käsitellä päättymättömiä tietorakenteita, kuten äärettömän pituisia listoja [Sco09, 525]. Äärettömän pituisia listoja voidaan hyödyntää esimerkiksi n ensimmäisen luonnollisen luvun yhteen laskemisessa aiemman esimerkin summa-funktion avulla: nsumma n = summa (take n [1..]) Funktiolla nsumma on yksi argumentti, joka kertoo, monenko ensimmäisen luonnollisen luvun summa halutaan laskea. Funktio kutsuu summa-funktiota, jonka argumentti on take-nimisen funktion kutsusta saatava lista. Funktio take on määritelty Haskellin standardikirjastossa [Ghc12b]. Sen argumentteina ovat kokonaisluku ja lista. Funktion take arvo on lista, joka koostuu halutusta määrästä alkioita argumenttina saadun listan alusta. Merkintä [1..] tarkoittaa ääretöntä luonnollisten lukujen listaa eli listaa [1,2,3,4,..]. Funktion summa argumentti on siis tässä tapauksessa lista, joka koostuu n ensimmäisestä luonnollisesta luvusta. Esimerkiksi funktiokutsulla nsumma 1000 funktion nsumma arvo olisi Korkeamman kertaluvun funktiot Funktionaalisessa ohjelmoinnissa funktiot ovat first-class-arvoja, eli funktion voi sitoa muuttujaan, ja sitä voi käyttää argumenttina ja arvona [Hud89, s. 382]. Funktiota, jonka argumenttina tai arvona on funktio, kutsutaan korkeamman kertaluvun funktioksi. Funktionaalisessa ohjelmoinnissa funktiolla voi siis olla funktio argumenttina tai arvona, ja toisaalta kyseinen funktio voi myös itse olla funktion argumentti tai arvo. Korkeamman kertaluvun funktioilla voidaan toteuttaa yleiskäyttöisiä funktioita. Niiden avulla voidaan ilmaista yleisessä muodossa sellaisia funktioita, joiden määritel-

13 10 mien rakenne on samanlainen [ASS96, s. 68]. Kun useamman funktion voi ilmaista yleisesti, ei kaikille tarvitse kirjoittaa määritelmää erikseen. Seuraavaksi tarkastellaan kahta funktiota, jotka voitaisiin ilmaista saman korkeamman kertaluvun funktion avulla. Funktio neliot luo listan, joka koostuu sen argumenttina saaman listan alkioiden neliöistä: neliot [] = [] neliot (x:xs) = x ^ 2 : neliot xs Funktiossa käytetään hahmonsovitusta. Jos argumenttina on tyhjä lista, funktion arvo on tyhjä lista. Jos argumentti on ainakin yhden alkion sisältävä lista, funktion arvo määräytyy funktion määritelmän toisen rivin mukaisesti. Lausekkeessa x ^ 2 : neliot xs esiintyvä operaattori : muodostaa listan, jossa operaattorin vasemmalla puolella oleva alkio lisätään operaattorin oikealla puolella olevan listan ensimmäiseksi alkioksi. Listan ensimmäiseksi alkioksi tulee siis argumenttina saadun listan ensimmäisen alkion neliö, ja loput alkiot saadaan kutsumalla neliot-funktiota rekursiivisesti lista-argumentin loppuosalle. Esimerkiksi funktiokutsu neliot [1,2,3] tuottaa listan [1,4,9]. Toinen esimerkkifunktio isoiksi saa argumenttina merkkijonon, ja sen arvo on vastaava merkkijono, jossa kirjaimet on muutettu isoiksi. Merkkijonot ovat Haskellissa Char-tyyppisistä arvoista koostuvia listoja, ja merkkijonojen kirjaimia voi käsitellä samalla tavalla kuin muidenkin listojen alkioita. Funktiossa käytetään Haskellin standardikirjaston funktiota toupper, joka palauttaa argumenttina saamaansa kirjainta vastaavan ison kirjaimen [Ghc12a]. isoiksi "" = "" isoiksi (c:cs) = toupper c : isoiksi cs Jos isoiksi-funktion argumenttina saama merkkijono on tyhjä, funktion arvo on

14 11 tyhjä merkkijono. Muussa tapauksessa rakennetaan uusi lista kutsumalla funktiota toupper merkkijonon ensimmäiselle merkille ja isoiksi-funktiota rekursiivisesti merkkijonon loppuosalle. Esimerkiksi funktiokutsu isoiksi "Hei maailma" tuottaisi merkkijonon "HEI MAAILMA". Funktioiden neliot ja isoiksi määritelmät muistuttavat suurelta osin toisiaan. Funktionaalisiset ohjelmointikielet tarjoavat niiden kaltaisten operaatioiden toteutukseen korkeamman asteen funktion, joka Haskellissa tunnetaan nimellä map. Funktio saa argumentteina funktion ja listan, ja se käyttää argumenttina saamaansa funktiota jokaiseen listan alkioon. Arvo, jonka map-funktio palauttaa, on lista argumenttina saadun funktion tuottamista arvoista. Funktio map on toteutettu Haskellin standardikirjastossa seuraavanlaisesti [Ghc12c]: map _ [] = [] map f (x:xs) = f x : map f xs Funktiossa käytetään hahmonsovitusta lista-argumenttiin. Jos map-funktiota kutsuttaessa toisena argumenttina on tyhjä lista, funktio palauttaa tyhjän listan. Merkintää _ voi käyttää argumentin tilalla, kun argumenttia ei tarvita. Jos map-funktion toinen argumentti on vähintään yhden alkion pituinen lista, suoritetaan funktion määritelmän toinen rivi. Tällöin palautetaan uusi lista, jonka ensimmäinen alkio on arvo, jonka funktio f palauttaa argumentilla x. Listan loppuosa on lista, jonka map-funktio palauttaa, kun sitä kutsutaan ensimmäisenä argumenttina funktio f ja toisena argumenttina alkuperäisen listan loppuosa xs. Funktiota map käyttäen voidaan listan lukujen neliöiden laskeminen nyt ilmaista neliot-funktiota lyhyemmin: map (\x -> x ^ 2) [1,2,3]

15 12 Funktiokutsun ensimmäinen argumentti on anonyymi funktio, joka saa yhden argumentin ja palauttaa kyseisen argumentin neliön. Funktio map käyttää anonyymia funktiota kaikkiin toisen argumenttinsa alkioihin. Tällöin map-funktion arvoksi tulee sama arvo kuin nelio-funktion arvo oli samalla lista-argumentilla, eli lista [1,4,9]. Vastaavasti funktion isoiksi sijaan voidaan kirjoittaa: map toupper "Hei maailma" Funktio map käyttää toupper-funktiota merkkijonon jokaiseen kirjaimeen. Tällöin map saa saman arvon kuin aiemmin esitelty isoiksi-esimerkki: "HEI MAAILMA". 4 Funktionaalisia ohjelmointikieliä Funktionaaliset ohjelmointikielet perustuvat lambdakalkyyliin, joka on Alonzo Churchin 1930-luvulla kehittämä matemaattinen laskennan malli [Chu41]. Sitä pidetään ensimmäisenä funktionaalisena ohjelmointikielenä, vaikka sen kehittämisen aikaan nykyaikaisia tietokoneita ei ollut vielä olemassa [Hud89, s. 363]. Lambdakalkyyli vastaa laskentavoimaltaan Turingin konetta: kaikki Turingin koneella laskettavissa olevat asiat pystytään laskemaan myös lambdakalkyylilla [Sco09, s. 506]. Toisin sanoen lambdakalkyyli on Turing-täydellinen. Lambdakalkyylin syntaksissa merkki λ esittelee funktion argumentit. Argumenttien perässä olevan pisteen jälkeen on lauseke, jolla funktion arvo lasketaan. Esimerkiksi kaksi lukua yhteen laskeva funktio voidaan kirjoittaa lambdakalkyylin syntaksilla seuraavasti: λxy.x + y Tässä luvussa esitellään kolmea erilaista lambdakalkyylin ideoihin perustuvaa funktionaalista ohjelmointikieltä.

16 Lisp Lisp on John McCarthyn 1950-luvulla kehittämä funktionaalinen ohjelmointikieli [McC60], ja se kuuluu vanhimpiin edelleen käytössä oleviin ohjelmointikieliin. Lispkieli esitteli aikoinaan uusia ominaisuuksia, jotka ovat olleet merkittävä osa sen jälkeen kehitettyjä funktionaalisia kieliä, mutta myös muita ohjelmointiparadigmoja edustavia kieliä. Esimerkiksi ehtolauseiden käyttö sekä roskienkeruu esiintyivät ensimmäisen kerran Lispissä [Hud89, s. 368]. Lisp ei ole puhdas funktionaalinen ohjelmointikieli, sillä se sallii imperatiivisen ohjelmoinnin piirteitä [Hud89, s. 369]. Lisp on dynaamisesti tyypitetty [LTh09, s. 68], ja se evaluoituu applikatiivisessa järjestyksessä [Hud89, s. 384]. Vuosien varrella Lispkielestä on kehitetty useita murteita, ja nykyään Lisp on murteistaan koostuva funktionaalisten kielten perhe [Hin09, s. 89]. Lispin murteita ovat muun muassa Common Lisp, Scheme ja Clojure. Lisp-kieltä on käytetty erityisesti tekoälyyn liittyvissä sovelluksissa [Sco09, s. 505]. Nimi Lisp on lyhenne sanoista "LISt Processor"[McC60, s. 184]. Lisp-kielissä funktiot esitetään listoina, joiden ensimmäinen alkio on käytettävän funktion nimi ja loput alkiot ovat funktion argumentteja. Myös Lisp-ohjelmat itsessään ovat listamuodossa, ja siten niitä voidaan käsitellä samalla tavalla kuin muutakin dataa [Sco09, s. 517]. Seuraavassa esimerkissä on Common Lisp -kielellä toteutettu yksinkertainen rekursiivinen funktio n:nnen Fibonaccin luvun laskemiseen: (defun fibonacci (n) (if (< n 3) 1 (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))

17 14 Funktio defun määrittelee fibonacci-nimisen funktion, jolla on yksi argumentti. Funktion fibonacci määritelmässä käytetään ehtolausetta: jos funktiokutsussa saadun argumentin arvo on pienempi kuin kolme, fibonacci-funktion arvoksi tulee luku 1. Muussa tapauksessa kutsutaan funktiota +, joka laskee argumenttiensa summan. Argumentteina on kaksi fibonacci-funktion kutsua; toinen lukua n yhtä pienemmälle ja toinen kahta pienemmälle luvulle. 4.2 ML ML on Lispin tavoin murteistaan koostuva funktionaalisten kielten perhe, jonka jäseniä ovat muun muassa Standard ML, OCaml ja F# [Hin09, s. 89]. ML-ohjelmointikieli kehitettiin 1970-luvulla, ja nimi ML tulee sanasta "meta language"[mmh97, s. ix]. Kieli oli alunperin metakieli, jota käytettiin toisen kielen analysointiin. ML:n kehittäjät huomasivat kielen hyödyllisyyden ja ryhtyivät kehittämään sitä lisää [Hud89, s. 374]. ML-kielet ovat staattisesti tyypitettyjä, ja niissä on käytössä tyypinpäättely [Sco09, s. 508]. ML oli ensimmäinen ohjelmointikieli, jossa tyypinpäättelyä käytettiin osana kieltä [Hud89, s. 375]. Sen jälkeen ilmestyneet staattisesti tyypitetyt funktionaaliset ohjelmointikielet ovat myös omaksuneet tyypinpäättelyn. Lispin tavoin ML ei ole puhdas funktionaalinen kieli, ja sillä on mahdollista ohjelmoida myös imperatiivisella tyylillä [Hud89, s. 374]. Seuraavassa esimerkissä on n:nnen Fibonaccin luvun laskeva funktio toteutettuna Standard ML -kielellä: fun fibonacci 1 = 1 fibonacci 2 = 1 fibonacci n = fibonacci (n - 1) + fibonacci (n - 2);

18 15 Avainsana fun määrittee fibonacci-nimisen funktion, jolla on yksi argumentti. Funktion toteutuksessa käytetään hahmonsovitusta, ja merkki erottaa eri vaihtoehdot toisistaan. Funktion määritelmä muistuttaa luvussa 3.1 esiteltyä Haskellkielellä kirjoitettua fibonacci-funktion määritelmää, ja funktio myös toimii samalla tavalla. 4.3 Haskell Haskell on puhdas ja laiskasti evaluoituva funktionaalinen ohjelmointikieli. ML:n tavoin Haskell on staattisesti tyypitetty, ja siinä on myös käytössä sama tyypinpäättelyjärjestelmä kuin ML-kielessä [Hud89, s. 375]. Haskell on enimmäkseen opetuksessa käytetty kieli [HHP07, s. 40], ja se on antanut vaikutteita moniin muihin ohjelmointikieliin, joihin lukeutuvat muun muassa Python ja Scala [HHP07, s ]. Haskell-kielen kehitti sitä varten perustettu komitea 1980-luvulla [HHP07, s. 3-4]. Ennen Haskellin ilmestymistä eri tahot olivat kehittäneet useita eri puhtaita, laiskoja funktionaalisia kieliä [HHP07, s. 3]. Nämä kielet muistuttivat paljon toisiaan, mutta ne eivät olleet kovin laajassa käytössä. Haskell sai alkunsa tarpeesta kehittää yksi yleinen funktionaalinen ohjelmointikieli, joka olisi puhdas ja laiska. Kuten luvussa 3.1 nähtiin, yksinkertainen n:nnen Fibonaccin luvun laskeva funktio voidaan toteuttaa Haskellilla seuraavanlaisesti: fibonacci :: Int -> Int fibonacci 1 = 1 fibonacci 2 = 1 fibonacci n = fibonacci(n - 1) + fibonacci(n - 2) Funktion toiminta on selitetty luvussa 3.1, mutta kyseisen luvun esimerkistä poiketen funktion määritelmän alkuun on lisätty tyyppiannotaatio (type signature).

19 16 Tyyppiannotaatio fibonacci :: Int -> Int tarkoittaa, että funktio fibonacci ottaa yhden Int-tyyppisen argumentin ja palauttaa Int-tyyppisen arvon. Koska Haskell käyttää tyypinpäättelyä, tyyppiannotaatio ei ole funktion määrittelyssä välttämätön, ja sen voisi jättää myös kokonaan kirjoittamatta. 5 Funktionaalisen ohjelmoinnin etuja ja ongelmia Funktionaalisesta ohjelmoinnista on etua ohjelmistojen kehittämisessä. Puhtaasti funktionaalisten ohjelmien tiedetään käyttäytyvän aina tietyllä tavalla, joten yllättäviä sivuvaikutuksia ei voi tapahtua ohjelman suorituksen aikana [Sco09, s. 509]. Tämä tekee funktionaalisista ohjelmista vakaita ja luotettavia. Sivuvaikutuksettomuuden vuoksi funktionaalisten ohjelmien on koettu useissa käytännön tapauksissa olevan vastaavaa imperatiivista ohjelmaa helpompia kehittää ja ylläpitää [Sco09, s. 509]. Sivuvaikutuksettomuudesta nähdään olevan hyötyä myös rinnakkaisen laskennan toteuttamisessa [Hin09, s. 90]. Rinnakkaista ja hajautettua laskentaa tarvitaan, jotta tietokoneohjelmien suorituksen nopeutta voidaan nostaa. Rinnakkaisohjelmoinnin ongelma on tiedon pitäminen eheänä, kun useampi säie pyrkii käsittelemään sitä samanaikaisesti [Hin09, s. 89]. Puhtaassa funktionaalisessa ohjelmakoodissa ei ole muuttujia, joten rinnakkaisuuden toteutuksessa ei ole vaaraa siitä, että säikeet lukisivat muuttujia tai kirjoittaisivat niihin väärään aikaan [Hin09, s. 90]. Funktionaalisilla ohjelmointikielillä voidaan siis toteuttaa rinnakkaista laskentaa turvallisesti. Automaattisen rinnakkaistamisen tarpeisiin funktionaalisten ohjelmointikielten kääntäjät eivät kuitenkaan vielä ole kyllin kehittyneitä [Hin09, s. 90]. Eduistaan huolimatta funktionaalinen ohjelmointi ei ole yhtä suuressa suosiossa kuin perinteinen imperatiivinen ohjelmointi [Sco09, s. 505]. Osaksi funktionaalisten kielten laajempaa käyttöä rajoittaa se, että rajapintoja muihin ohjelmointikieliin on

20 17 vähän [Sco09, s. 509]. Lisäksi puutteita on ohjelmistojen kehityksessä tarvittavissa työkaluissa [Wad98, s. 24]. Virheiden etsimiseen ja ajan- ja tilankäytön profilointiin tarvittavia välineitä ei ole useille funktionaalisille ohjelmointikielille saatavilla, eikä funktionaalisille kielille tarkoitettuja monipuolisia ohjelmointiympäristöjä juurikaan ole. Imperatiiviseen ohjelmointiin tottuneelle ohjelmoijalle funktionaaliseen ohjelmointiin siirtyminen ei ole välttämättä helppoa [Wad98, s. 24]. Koska funktionaalinen ohjelmointityyli poikkeaa paljon imperatiivisesta tyylistä, voi funktionaalisen ratkaisun keksiminen ongelmaan olla vaikeaa siinä missä imperatiivinen ratkaisu tulee mieleen luonnostaan. Lisäksi jotkut ongelmat ovat helpommin ratkaistavissa imperatiivisella ohjelmointityylillä kuin funktionaalisesti [Wad98, s. 24]. 6 Yhteenveto Funktionaalinen ohjelmointi on matemaattisten funktioiden käyttöön perustuvaa ohjelmointia. Funktionaalisen ohjelmoinnin juuret ovat lambdakalkyylissa, ja esimerkkejä funktionaalisista ohjelmointikielistä ovat muun muassa Lispin ja ML:n murteet sekä Haskell. Funktionaalisessa ohjelmoinnissa funktiot ovat usein rekursiivisesti määriteltyjä. Lisäksi funktionaaliselle ohjelmoinnille on ominaista funktioiden esiintyminen funktioiden argumentteina ja arvoina. Tämä mahdollistaa yleiskäyttöisten funktioiden laatimisen. Funktionaaliset kielet voivat olla staattisesti tai dynaamisesti tyypitettyjä. Staattisesti tyypitetyissä kielissä käytetään usein tyypinpäättelyä. Funktioiden evaluointi voidaan suorittaa applikatiivisessa järjestyksessä tai normaalijärjestyksessä. Jälkimmäisen vaihtoehdon tapauksessa laiska evaluointi on tehokas tapa evaluoida funk-

21 18 tiot. Funktionaalisessa ohjelmoinnissa pyritään välttämään sivuvaikutuksia: funktio ei tee muuta kuin laskee arvon ja palauttaa sen. Luonnostaan sivuvaikutuksia aiheuttavat toiminnot, kuten syötteen lukeminen ja poikkeukset, voidaan toteuttaa funktionaalisissa ohjelmointikielissä joko kieleen rakennettuna mekanismina tai sallimalla imperatiivisen ohjelmointityylin käyttöä. Sivuvaikutuksettomuudesta on etua, kun halutaan varmistua siitä, että ohjelma toimii kaikissa tilanteissa halutulla tavalla. Lisäksi sivuvaikutuksettomuudesta voidaan hyötyä rinnakkaisessa laskennassa. Funktionaalinen ohjelmointi ei ole yhtä laajassa käytössä kuin imperatiivinen ohjelmointi. Osaksi tätä selittävät puutteet kehitystyökaluissa sekä rajapinnoissa muihin ohjelmointikieliin. Lisäksi imperatiiviseen ohjelmointiin tottuneelle funktionaalisen ohjelmoinnin omaksuminen ei ole aina helppoa. Mahdollisesta haastavuudestaan huolimatta funktionaalisen ohjelmoinnin opetteleminen tuo ohjelmoijalle uusia näkökulmia ohjelmointiongelmien ratkaisemiseen.

22 Lähteet 19 ASS96 Abelson, H., Sussman, G. ja Sussman, J., Structure and Interpretation of Computer Programs. The MIT Press, Cambridge, Massachusetts, toinen painos, URL [ ] Sivunumerot viittaavat kirjan verkkoversioon. Chu41 Church, A., The calculi of lambda-conversion. Princeton university press, Princeton, Ghc12a Data.Char, Haskellin dokumentaatio, docs/latest/html/libraries/base/data-char.html. [ ]. Ghc12b Data.List, Haskellin dokumentaatio, docs/latest/html/libraries/base/data-list.html. [ ]. Ghc12c GHC/Base.lhs, Haskellin standardikirjasto, haskell.org/packages/archive/base/latest/doc/html/src/ GHC-Base.html#map. The University of Glasgow, [ ]. HHP07 Hudak, P., Hughes, J., Peyton Jones, S. ja Wadler, P., A history of haskell: being lazy with class. Proceedings of the third ACM SIGPLAN conference on History of programming languages. ACM, 2007, sivut Hin09 Hinsen, K., The promises of functional programming. Computing in Science & Engineering, 11,4(2009), sivut Hud89 Hudak, P., Conception, evolution, and application of functional programming languages. ACM Computing Surveys, 21,3(1989), sivut

23 20 Hug89 Hughes, J., Why functional programming matters. The Computer Journal, 32,2(1989), sivut LTh09 Läufer, K. ja Thiruvathukal, G. K., The promises of typed, pure, and lazy functional programming: part ii. Computing in Science & Engineering, 11,5(2009), sivut McC60 McCarthy, J., Recursive functions of symbolic expressions and their computation by machine, part i. Communications of the ACM, 3,4(1960), sivut MMH97 Milner, R., Mads, T., Harper, R. ja MacQueen, D., The Definition of Standard ML (Revised). The MIT Press, Cambridge, Massachusetts, Sco09 Scott, M. L. Programming language pragmatics. Elsevier/Morgan Kaufmann Pub., Wad92 Wadler, P., The essence of functional programming. POPL 92 Proceedings of the 19th ACM SIGPLAN-SIGACT symposium on Principles of programming languages, 1992, sivut Wad98 Wadler, P., Why no one uses functional languages. SIGPLAN Not., 33,8(1998), sivut

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

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

arvostelija OSDA ja UDDI palveluhakemistoina.

arvostelija OSDA ja UDDI palveluhakemistoina. Hyväksymispäivä Arvosana arvostelija OSDA ja UDDI palveluhakemistoina. HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta/Osasto Fakultet/Sektion Faculty/Section Laitos Institution

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

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 VI Funktionaalinen ohjelmointi Sisältö 1. Johdanto ja peruskäsitteitä 2. LISP- ja Scheme-kielet 3. Haskell 4. IO funktionaalisissa kielissä 5. Muita funktionaalisia

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

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

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

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

Selainpelien pelimoottorit

Selainpelien pelimoottorit Selainpelien pelimoottorit Teemu Salminen Helsinki 28.10.2017 Seminaaritutkielma Helsingin yliopisto Tietojenkäsittelytiede ! 1 HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 7: Funktionaalista ohjelmointia (mm. SICP 3.5) Riku Saikkonen 13. 11. 2012 Sisältö 1 Laiskaa laskentaa: delay ja force 2 Funktionaalinen I/O 3 Funktionaalista

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

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

TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä TIE-20306 Principles of Programming Languages Seminaariesityksen essee Ryhmä 18: Heidi Vulli, Joni Heikkilä SISÄLLYSLUETTELO 1. Johdanto... 1 2. Ohjelmointikielen perusperiaatteet... 1 2.1 Paradigmat...

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

Funktionaalinen ohjelmointi

Funktionaalinen ohjelmointi Funktionaalinen ohjelmointi Aiemmin on käsitelty nykyohjelmoinnin suosituimpia ohjelmointiparadigmoja: imperatiivista ohjelmointia ja olio-ohjelmointia. Tässä osassa perehdytään funktionaaliseen ohjelmointiin

Lisätiedot

Clojure, funktionaalinen Lisp murre

Clojure, funktionaalinen Lisp murre Clojure, funktionaalinen Lisp murre Principles of Programming Languages, S2015 Jukka Pekka Venttola & Pietari Heino Taustaa Clojuren pohjana on käytetty Lisp ohjelmointikieltä, jonka historia ulottuu 1950

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

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

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen Chapel TIE-20306 Ryhmä 91 Joonas Eloranta Lari Valtonen Johdanto Chapel on Amerikkalaisen Cray Inc. yrityksen kehittämä avoimen lähdekoodin ohjelmointikieli. Chapel on rinnakkainen ohjelmointikieli, joka

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

Funktio-ohjelmoinnin hyödyntäminen peliohjelmoinnissa

Funktio-ohjelmoinnin hyödyntäminen peliohjelmoinnissa Simo Rinne Funktio-ohjelmoinnin hyödyntäminen peliohjelmoinnissa Tietotekniikan kandidaatintutkielma 28. huhtikuuta 2015 Jyväskylän yliopisto Tietotekniikan laitos Tekijä: Simo Rinne Yhteystiedot: simo.e.rinne@student.jyu.fi

Lisätiedot

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006 Jatkeet TIES341 Funktio ohjelmointi 2 Kevät 2006 Havainto: häntäkutsu (1) Funktiokutsun yleinen toimintaperiaate: (koskee vain täysiä kutsuja, ts. jotka eivät palauta funktiota) kutsuja kirjaa pinoon paluuosoitteen

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

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011 TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 16. helmikuuta 2011 Sisällys Sisällys Ohjelmointikieli? programming language n. a

Lisätiedot

Funktionaalinen ohjelmointi

Funktionaalinen ohjelmointi Funktionaalinen ohjelmointi Aiemmin on käsitelty nykyohjelmoinnin suosituimpia ohjelmointiparadigmoja: imperatiivista ohjelmointia ja olio-ohjelmointia. Tässä osassa perehdytään funktionaaliseen ohjelmointiin

Lisätiedot

TIE Principles of Programming Languages CEYLON

TIE Principles of Programming Languages CEYLON TIE-20306 Principles of Programming Languages CEYLON SISÄLLYSLUETTELO 1. YLEISTIETOA KIELESTÄ JA SEN KEHITTÄMISESTÄ... 1 2. CEYLONIN OMINAISUUKSIA... 2 2.1 Modulaarisuus... 2 2.2 Tyypit... 2 2.3 Muita

Lisätiedot

Common Lisp Object System

Common Lisp Object System Common Lisp Object System Seminaarityö Tomi Vihtari Ohjelmointikielten periaatteet kevät 2004 Helsingin Yliopisto Tietojenkäsittelytieteen laitos Järvenpää 5. huhtikuuta 2004 Sisältö 1 Johdanto... 1 2

Lisätiedot

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki PERL TIE-20306 Principles of Programming Languages Ryhmä 4: Joonas Lång & Jasmin Laitamäki 1. Johdanto Perl on ohjelmointikielten perhe, johon kuuluu Perl 5 ja Perl 6. Kielet ovat kuitenkin erilliset ohjelmointikielet

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

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

Tutoriaaliläsnäoloista

Tutoriaaliläsnäoloista Tutoriaaliläsnäoloista Tutoriaaliläsnäolokierroksella voi nyt täyttää anomuksen läsnäolon merkitsemisestä Esim. tagi ei toiminut, korvavaltimon leikkaus, yms. Hyväksyn näitä omaa harkintaa käyttäen Tarkoitus

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 12. huhtikuuta 2019 Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä. Yksi A4-kokoinen lunttilappu

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 4. Joukot, relaatiot ja funktiot Osa 3: Funktiot 4.3 Funktiot Olkoot A ja B joukkoja. Funktio joukosta A joukkoon B on sääntö, joka liittää yksikäsitteisesti määrätyn

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 6: Rajoite-esimerkki, funktionaalista ohjelmointia (mm. SICP 3.3.5, 3.5) Riku Saikkonen 8. 11. 2012 Sisältö 1 SICP 3.3.5 esimerkki: rajoitteiden vyörytysjärjestelmä

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

Tietorakenteet ja algoritmit - syksy 2015 1

Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä

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

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:

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

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

JAAKKO RINTA-FILPPULA FUNKTIONAALISEN OHJELMOINNIN HYÖDYT JA HAAS- TEET. Kandidaatintyö

JAAKKO RINTA-FILPPULA FUNKTIONAALISEN OHJELMOINNIN HYÖDYT JA HAAS- TEET. Kandidaatintyö JAAKKO RINTA-FILPPULA FUNKTIONAALISEN OHJELMOINNIN HYÖDYT JA HAAS- TEET Kandidaatintyö Tarkastaja: Tiina Schafeitel-Tähtinen Jätetty tarkastettavaksi 16.12.2017 I TIIVISTELMÄ JAAKKO RINTA-FILPPULA: Funktionaalisen

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

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

Laiska laskenta, korekursio ja äärettömyys. TIEA341 Funktio ohjelmointi Syksy 2005 Laiska laskenta, korekursio ja äärettömyys TIEA341 Funktio ohjelmointi Syksy 2005 Muistatko graafinsievennyksen? DAG esitys ja graafinsievennys DAG esitys Lausekkeen rakennepuu, jossa yhteiset alilausekkeet

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 8: Pienen ohjelmointikielen tulkki (ohjelmoitava laskin) (mm. SICP 4-4.1.5 osin) Riku Saikkonen 15. 11. 2012 Sisältö 1 Nelilaskintulkki, globaalit muuttujat

Lisätiedot

Prolog kielenä Periaatteet Yhteenveto. Prolog. Toni ja Laura Fadjukoff. 9. joulukuuta 2010

Prolog kielenä Periaatteet Yhteenveto. Prolog. Toni ja Laura Fadjukoff. 9. joulukuuta 2010 kielenä 9. joulukuuta 2010 Historia kielenä Historia Sovelluksia kehitettiin vuonna 1972 Kehittäjinä ranskalaiset Pääkehittäjä Alain Colmerauer Philippe Roussel programmation en logique Robert Kowalski

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 6: Funktionaalista ohjelmointia: todistamisesta, virrat ja I/O, hahmonsovitus (mm. SICP 3.5) Riku Saikkonen 8. 11. 2011 Sisältö 1 Vähän funktionaalisten

Lisätiedot

1. Olio-ohjelmointi 1.1

1. Olio-ohjelmointi 1.1 1. Olio-ohjelmointi 1.1 Sisällys Olio-ohjelmointi on eräs ohjelmointiparadigma. Olio-ohjelmoinnin muotoja. Ohjelmiston analyysi ja suunnittelu. Olioparadigman etuja ja kritiikkiä. 1.2 Ohjelmointiparadigmoja

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 11: Tulkin muokkaaminen, sisäiset määrittelyt, makrot (mm. SICP 3.2.4, 4-4.1.6) Riku Saikkonen 29. 11. 2012 Sisältö 1 Kirjan tulkin muokkaaminen 2 Yksityiskohta:

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 3: Funktionaalinen listankäsittely ja listankäsittelyoperaatiot (mm. SICP 22.2.3) Riku Saikkonen 31. 10. 2011 Sisältö 1 Linkitetyt listat 2 Listarakenteet

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 12. lokakuuta 2016

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 12. lokakuuta 2016 ja ja TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 12. lokakuuta 2016 Sisällys ja ja Vuosi on 1936, eikä tietokoneita ollut. Computer oli ammattinimike. http://www.nasa.gov/centers/dryden/

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

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

8. Kieliopit ja kielet

8. Kieliopit ja kielet 8. Kieliopit ja kielet Suomen kielen sanoja voidaan yhdistellä monella eri tavalla. Kielioppi määrää sen, milloin sanojen yhdistely antaa oikein muodostetun lauseen. "Mies räpyttää siipiään" on kieliopillisesti

Lisätiedot

Pro gradu -tutkielma Meteorologia SUOMESSA ESIINTYVIEN LÄMPÖTILAN ÄÄRIARVOJEN MALLINTAMINEN YKSIDIMENSIOISILLA ILMAKEHÄMALLEILLA. Karoliina Ljungberg

Pro gradu -tutkielma Meteorologia SUOMESSA ESIINTYVIEN LÄMPÖTILAN ÄÄRIARVOJEN MALLINTAMINEN YKSIDIMENSIOISILLA ILMAKEHÄMALLEILLA. Karoliina Ljungberg Pro gradu -tutkielma Meteorologia SUOMESSA ESIINTYVIEN LÄMPÖTILAN ÄÄRIARVOJEN MALLINTAMINEN YKSIDIMENSIOISILLA ILMAKEHÄMALLEILLA Karoliina Ljungberg 16.04.2009 Ohjaajat: Ari Venäläinen, Jouni Räisänen

Lisätiedot

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti Luku 6 Dynaaminen ohjelmointi Dynaamisessa ohjelmoinnissa on ideana jakaa ongelman ratkaisu pienempiin osaongelmiin, jotka voidaan ratkaista toisistaan riippumattomasti. Jokaisen osaongelman ratkaisu tallennetaan

Lisätiedot

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

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python 8. marraskuuta 2010 Ohjelmointi Perusteet Peruskäsitteitä Olio-ohjelmointi Pythonin alkeet Esittely Esimerkkejä Muuttujat

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 22. huhtikuuta 2016 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille! Kirjoittamasi luokat, funktiot ja aliohjelmat

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

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

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä Rekursiolause Laskennan teorian opintopiiri Sebastian Björkqvist 23. helmikuuta 2014 Tiivistelmä Työssä käydään läpi itsereplikoituvien ohjelmien toimintaa sekä esitetään ja todistetaan rekursiolause,

Lisätiedot

Aika/Datum Month and year Kesäkuu 2012

Aika/Datum Month and year Kesäkuu 2012 Tiedekunta/Osasto Fakultet/Sektion Faculty Laitos/Institution Department Filosofian, historian, kulttuurin ja taiteiden tutkimuksen laitos Humanistinen tiedekunta Tekijä/Författare Author Veera Lahtinen

Lisätiedot

1 Tavoitteet. 2 Periaatteet ja ominaisuudet. 2.1 Tyyppipäättely

1 Tavoitteet. 2 Periaatteet ja ominaisuudet. 2.1 Tyyppipäättely 1 Tavoitteet Rustin ensimmäinen tavoite on olla vakavasti otettava vaihtoehto C:lle ja C++:lle kaikissa sovelluksissa. Hyvän suorituskyvyn lisäksi tämä tarkoittaa deterministisyyttä, minimaalista ajoympäristöä

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 4: SICP kohta 3.3.5 ja funktionaalista ohjelmointia Riku Saikkonen 15. 11. 2010 Sisältö 1 Ensimmäisen kierroksen tehtävistä 2 SICP 3.3.5: rajoitteiden

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

Toistorakenteet C#:ssa ja Haskellissa

Toistorakenteet C#:ssa ja Haskellissa Mikko Häyrynen Toistorakenteet C#:ssa ja Haskellissa Tietotekniikan kandidaatintutkielma 20. joulukuuta 2017 Jyväskylän yliopisto Tietotekniikka Tekijä: Mikko Häyrynen Yhteystiedot: mianhayr@student.jyu.fi

Lisätiedot

Mitä funktionaalinen ohjelmointi on

Mitä funktionaalinen ohjelmointi on Funktionaalinen ohjelmointi Mitä funktionaalinen ohjelmointi on - Funktionaalisessa ohjelmoinnissa mallinnus keskittyy löytämään ongelmasta sellaisia tiedon muunnoksia, jotka voidaan esittää matemaattisina

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 4 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten lauseisiin, lausekkeisiin ja aliohjelmiin liittyvät kysymykset. Tehtävä 1. Mitä

Lisätiedot

Erlang. Miika Heinonen ja Lassi Uosukainen (Group 92) TIE Principles of Programming Languages Seminaariessee. Yleistä

Erlang. Miika Heinonen ja Lassi Uosukainen (Group 92) TIE Principles of Programming Languages Seminaariessee. Yleistä Yleistä Erlang Miika Heinonen ja Lassi Uosukainen (Group 92) TIE-20306 Principles of Programming Languages Seminaariessee Erlang on Ericcsonin kehittämä funktionaalinen ohjelmointikieli ja ajoympäristö,

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2018-2019 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

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

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

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python 31. tammikuuta 2009 Ohjelmointi Perusteet Pythonin alkeet Esittely Esimerkkejä Muuttujat Peruskäsitteitä Käsittely

Lisätiedot

Työn laji Arbetets art Level Aika Datum Month and year Sivumäärä Sidoantal Number of pages

Työn laji Arbetets art Level Aika Datum Month and year Sivumäärä Sidoantal Number of pages Tiedekunta/Osasto Fakultet/Sektion Faculty Laitos Institution Department Tekijä Författare Author Työn nimi Arbetets titel Title Oppiaine Läroämne Subject Työn laji Arbetets art Level Aika Datum Month

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

3. Muuttujat ja operaatiot 3.1

3. Muuttujat ja operaatiot 3.1 3. Muuttujat ja operaatiot 3.1 Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi. Operaattorit. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit.

Lisätiedot

Funktionaalisten kielten oppimisesta ja valinnasta

Funktionaalisten kielten oppimisesta ja valinnasta Funktionaalisten kielten oppimisesta ja valinnasta Tampere 24.1.2018 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 1 Kehitystä? 23.1.2018 Ideal Learning Ltd 2018, All Rights Reserved 2 Tarve funktionaaliselle

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, todistamisesta (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 7. 11. 2011 Sisältö 1 Muuttujan arvon muuttaminen: set! 2 SICP-oliot

Lisätiedot

Rajoittamattomat kieliopit (Unrestricted Grammars)

Rajoittamattomat kieliopit (Unrestricted Grammars) Rajoittamattomat kieliopit (Unrestricted Grammars) Laura Pesola Laskennanteorian opintopiiri 13.2.2013 Formaalit kieliopit Sisältävät aina Säännöt (esim. A -> B C abc) Muuttujat (A, B, C, S) Aloitussymboli

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 28.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 28.2.2011 1 / 46 Ohjelmointiprojektin vaiheet 1. Määrittely 2. Ohjelman suunnittelu (ohjelman rakenne ja ohjelman

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

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 perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 1.3.2010 1 / 36 Monikko Monikko (engl. tuple) muistuttaa listaa, mutta monikon sisältöä ei voi muuttaa sen jälkeen,

Lisätiedot

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen D-OHJELMOINTIKIELI AA-kerho, 33 Antti Uusimäki Arto Savolainen 2 D-OHJELMOINTIKIELI D-kielen historia alkaa vuodesta 1999, kun Walter Bright aloitti uuden ohjelmointikielen kehittämisen. Ensimmäinen versio

Lisätiedot

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

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit. 3. Muuttujat ja operaatiot Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi.. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit. Arvojen

Lisätiedot

Hohde Consulting 2004

Hohde Consulting 2004 Luento 5: XQuery AS-0.110 XML-kuvauskielten perusteet Janne Kalliola XQuery XQuery uudet funktiot sekvenssit muuttujat Iterointi järjestys suodatus järjestäminen Ehtorakenteet Muita toimintoja www.hohde.com

Lisätiedot

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

Luku 5. Monadit. 5.1 Siirrännän ongelma Luku 5 Monadit There are lots of books about functional programming in Haskell. They tend to concentrate on the beautiful core of functional programming: higher order functions, algebraic data types, polymorphic

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

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 16.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 16.2.2010 1 / 41 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 11.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 11.2.2009 1 / 33 Kertausta: listat Tyhjä uusi lista luodaan kirjoittamalla esimerkiksi lampotilat = [] (jolloin

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 20. huhtikuuta 2018 Vastaa kaikkiin tehtäviin. Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä.

Lisätiedot

Ongelma(t): Mikä on Turingin kone? Miten Turingin kone liittyy funktioihin ja algoritmeihin? Miten Turingin kone liittyy tietokoneisiin?

Ongelma(t): Mikä on Turingin kone? Miten Turingin kone liittyy funktioihin ja algoritmeihin? Miten Turingin kone liittyy tietokoneisiin? Ongelma(t): Mikä on Turingin kone? Miten Turingin kone liittyy funktioihin ja algoritmeihin? Miten Turingin kone liittyy tietokoneisiin? 2013-2014 Lasse Lensu 2 Algoritmit ovat deterministisiä toimintaohjeita

Lisätiedot