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

Koko: px
Aloita esitys sivulta:

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

Transkriptio

1 JAAKKO RINTA-FILPPULA FUNKTIONAALISEN OHJELMOINNIN HYÖDYT JA HAAS- TEET Kandidaatintyö Tarkastaja: Tiina Schafeitel-Tähtinen Jätetty tarkastettavaksi

2 I TIIVISTELMÄ JAAKKO RINTA-FILPPULA: Funktionaalisen ohjelmoinnin hyödyt ja haasteet Tampereen teknillinen yliopisto Kandidaatintyö, 18 sivua joulukuu 2017 Tietotekniikan koulutusohjelma Pääaine: ohjelmistotekniikka Tarkastajat: Tiina Schafeitel-Tähtinen Avainsanat: Funktionaalinen ohjelmointi Funktionaalisissa ohjelmointikielissä on monia ominaisuuksia, jotka helpottavat ohjelmien kirjoittamista sekä parantavat niiden toimintavarmuutta. Funktionaalinen ohjelmointi eroaa kuitenkin monin tavoin yleisemmin käytössä olevista proseduraalisista sekä olio-ohjelmointikielistä. Tämän kandidaatintyön tarkoituksena on tutkia ja esitellä funktionaalisen ohjelmoinnin tarjoamia hyötyjä sekä muutamia haasteita, joita ohjelmoija kohtaa siirtyessään funktionaaliseen ohjelmointiin. Työssä esitellään aluksi lyhyesti yleisimpiä ohjelmointiparadigmoja: proseduraalista ja olio-ohjelmointia. Tämän jälkeen esitellään funktionaalista ohjelmointia, sen historiaa sekä Haskell-ohjelmointikieltä. Funktionaalisen ohjelmoinnin hyötyihin ja haasteisiin perehdytään kirjallisuustutkimuksen ja oman ohjelmointiprojektin kautta.

3 II SISÄLLYS 1. Johdanto Ohjelmointiparadigmat Proseduraalinen ohjelmointi Olio-ohjelmointi Funktionaalinen ohjelmointi Historiaa Haskell Hyödyt Haasteet Rekursio Korkeamman asteen funktiot Sivuvaikutuksien esittäminen Ohjelmointiprojekti Yhteenveto Lähteet

4 1 LYHENTEET JA MERKINNÄT HTTP JSON URL Hypertext Transfer Protocol, WWW-palvelinten ja -selainten käyttämä tiedonsiirtoprotokolla. JavaScript Object Notation, datan serialisointiin tarkoitettu yksinkertainen ja laajasti käytössä oleva tekstiformaatti. Uniform Resource Locator, web-resurssin tekstimuotoinen osoite.

5 2 1. JOHDANTO Funktionaalinen ohjelmointi lupaa ohjelmoijille monia houkuttelevia ominaisuuksia, joiden avulla ohjelmista tulee muun muassa helpommin ymmärrettäviä ja toimintavarmempia. Tällaiset ominaisuudet ovatkin varmasti suurin syy opetella ja käyttää funktionaalisia ohjelmointikieliä. Funktionaalisia ohjelmointikieliä opetetaan ja käytetään kuitenkin vähemmän kuin proseduraalisia ja oliopohjaisia kieliä, ja siksi suurelle osalle ohjelmoijista funktionaalinen ohjelmointi onkin vieras aihealue. Tämän työn tarkoituksena on selvittää, millaisiin haasteisiin ohjelmoija törmää siirtyessään imperatiivisista ja oliopohjaisista ohjelmointikielistä funktionaalisiin. Mitkä asiat tulee toteuttaa funktionaalisessa ohjelmoinnissa eri tavalla? Miksi näiden uusien ajatusmallien omaksuminen saattaa olla haasteellista? Tutkimuskysymyksiä pohditaan aikaisimpien tutkimusten sekä oman ohjelmointiprojektin kautta. Aluksi työssä esitellään hieman proseduraalista ohjelmointiparadigmaa sekä olioohjelmointia. Luvussa 3 esitellään funktionaalinen ohjelmointi ja sen historiaa sekä perehdytään sen hyötyihin ja haasteisiin. Luvussa 4 tarkastellaan esiteltyjä hyötyjä ja haasteita oman ohjelmointiprojektin kautta. Lopuksi yhteenvetoluvussa kootaan yhteen tutkimuksen tulokset ja arvioidaan niiden yleisyyttä. Työn koodiesimerkit on kirjoitettu Haskell-kielellä, ellei toisin mainita.

6 3 2. OHJELMOINTIPARADIGMAT Ohjelmointikieliä voidaan luokitella eri tavoilla: Jotkin kielet käännetään konekoodiksi, kun taas toisten suoritus tapahtuu tulkkaamalla. Joissakin kielissä on käytössä staattinen tyypitys ja toisissa tyypit tarkistetaan dynaamisesti ohjelman suorituksen aikana. Edellä mainittujen lisäksi ohjelmointikieliä voidaan luokitella myös niiden edustaman ohjelmointiparadigman mukaan. Ohjelmointiparadigmalla tarkoitetaan ajatusmallia, jonka mukaan ohjelmointi tapahtuu [16]. Se on lähestymistapa, joukko käytäntöjä sekä malleja, joiden kautta pyritään saavuttamaan haluttu lopputulos [11]. Neljänä pääparadigmana voidaan pitää imperatiivista, funktionaalista, logiikkapohjaista sekä olio-ohjelmointia [16]. Termejä imperatiivinen ja proseduraalinen ohjelmointi käytetään usein tarkoittamaan samaa asiaa. Myös tässä työssä termejä käytetään vaihdellen. Yksi ohjelmointikieli voi edustaa useampaa paradigmaa samanaikaisesti. Tässä työssä keskitytään proseduraalisen ja funktionaalisen ohjelmoinnin eroihin. 2.1 Proseduraalinen ohjelmointi Proseduraalinen ohjelmointi on kenties monille tutuin paradigma, sillä monet suositut ohjelmointikielet kuten C, Java, Python ja Ruby ovat proseduraalisia kieliä. Näistä Java, Python ja Ruby ovat myös oliopohjaisia kieliä. Proseduraalisessa ohjelmoinnissa ohjelma suoritetaan rivi riviltä siinä järjestyksessä, jossa rivit ovat. Suoritusjärjestystä voidaan muuttaa komennoilla, kuten for, while, goto ja if [11]. Imperatiiviselle ohjelmoinnille on myös tyypillistä, että ohjelman globaali tila muuttuu suorituksen aikana [16]. Seuraavassa koodiesimerkissä on esitetty lukujen 1 20 summaaminen C-kielellä. 1 int sum = 0; 2 3 for ( int i = 1; i <= 20; ++i) { 4 sum = sum + i; 5 } 6 7 printf ("%d", sum ); // 210

7 2.2. Olio-ohjelmointi 4 Rivillä 1 on alustettu muuttuja sum, johon laskennan tulos talletetaan. Tulokseen päädytään käymällä luvut 1 20 läpi yksi kerrallaan for-silmukassa ja lisäämällä ne edellisten summaan. Ohjelman tila siis muuttuu joka kierroksella. Muuttujan arvon muuttaminen on esimerkki sivuvaikutuksesta. Sivuvaikutus tarkoittaa, että arvon tuottamisen lisäksi lausekkeen suoritus muuttaa ohjelman tai järjestelmän tilaa. Seuraavassa koodiesimerkissä on toteutettu Ruby-kielellä funktio, joka kertoo annetun luvun kahdella ja palauttaa tuloksen. Funktiolla on kuitenkin myös sivuvaikutus: se ylikirjoittaa tärkeän tiedoston sisällön. 1 def double_ number ( num ) 2 File. open ( important - file, w ) { f f. write ( lorem ipsum ) } 3 num * 2 4 end Funktion käyttäjän tulee olla tietoinen sen mahdollisista sivuvaikutuksista. Tämä vaikeuttaa ohjelman ymmärtämistä varsinkin, jos sivuvaikutus riippuu saman tai muiden funktioiden aiemmista kutsukerroista. Pienissä ohjelmissa tämä ei ole ongelma, mutta mitä isommaksi koodipohja kasvaa, sitä isompi ongelma yllättävistä sivuvaikutuksista tulee. Moniin tavallisiin operaatioihin, kuten tiedoston lukemiseen, tulostamiseen ja satunnaislukujen generointiin liittyy sivuvaikutuksia, joten niitä ei voida koskaan täysin välttää. 2.2 Olio-ohjelmointi Olio-ohjelmointi on nykyisin eniten käytetty ohjelmointiparadigma. Sen kehitti Alan Kay työstäessään Smalltalk-ohjelmointikieltä, joka julkaistiin vuonna Kaksi vuotta myöhemmin julkaistiin C-kieleen perustuva C++, joka on edelleen laajassa käytössä. Muita suosittuja olio-ohjelmointikieliä ovat muun muassa Java, Python ja C. [11] Olio-ohjelmoinnissa keskeisessä asemassa ovat oliot, joiden avulla voidaan ryhmitellä dataa ja siihen liittyviä operaatioita. Oliot kapseloivat sisäänsä dataa, johon pääsee käsiksi ulkopuolelta vain niiden tarjoamien metodien avulla. [11] Jokainen olio on jonkin luokan instanssi. Saman luokan instansseilla on kaikilla samat luokan määrittelemät toiminnot. Luokat voivat periytyä toisista luokista, jolloin jälkeläisellä on käytössä vanhemman data ja toiminnot. [2] Seuraavassa koodiesimerkissä on yksinkertainen luokka, joka kuvaa autoa.

8 2.2. Olio-ohjelmointi 5 1 c l a s s Car { 2 public : 3 int getspeed () const ; 4 void setspeed ( i n t newspeed ); 5 6 private : 7 int speed_ ; 8 }; Luokasta Car luotujen olioiden sisäistä, private-osassa määriteltyä dataa ei voi muokata suoraan. Siihen on mahdollista päästä käsiksi vain käyttämällä luokan julkisen rajapinnan (public-osa) määrittelemiä metodeja.

9 6 3. FUNKTIONAALINEN OHJELMOINTI Funktionaalisessa ohjelmoinnissa ohjelman suoritus perustuu funktioiden evaluointiin. Toisin kuin imperatiivisessa ohjelmoinnissa, funktionaalisessa ohjelmoinnissa ohjelmalla ei ole implisiittistä tilaa, jota funktiot voisivat muuttaa. Funktiot voivatkin siis käsitellä vain niille parametrina annettuja arvoja. Kun imperatiivisessa ohjelmoinnissa usein määritellään miten ohjelman suoritus tapahtuu, funktionaalisessa ohjelmoinnissa puolestaan kuvataan mitä halutaan saada tulokseksi. Moderneille funktionaalisille ohjelmointikielille tyypillisiä ominaisuuksia ovat muun muassa korkeamman asteen funktiot (engl. higher-order function), laiska evaluointi (engl. lazy evaluation) ja hahmonsovitus (engl. pattern matching). [6] Laiska evaluointi tarkoittaa, että lausekkeiden arvoja ei lasketa ennen kuin se on täysin välttämätöntä. Tämä mahdollistaa esimerkiksi äärettömien listojen käsittelyn. Hahmonsovituksessa funktion määritelmä valitaan annettujen parametrien perusteella. Funktionaalisessa ohjelmoinnissa datan käsittely on tehokasta, sillä funktioita voidaan yhdistellä helposti. Tämän takia se soveltuukin hyvin dataintensiivisten ongelmien ratkaisemiseen. Datan käsittely ei kuitenkaan ole ainoa käyttötarkoitus funktionaalisille ohjelmointikielille, vaan niitä voidaan käyttää kaikenlaisten ohjelmien toteuttamiseen. Esimerkiksi Haskellille löytyy paljon valmiita kirjastoja aina web-palvelinsovellusten toteuttamisesta graafisten käyttöliittymien luomiseen, ja Clojure-kielessä voidaan käyttää olemassa olevia Java-kirjastoja. 3.1 Historiaa Ensimmäisenä funktionaalisena ohjelmointikielenä voidaan pitää Alonzo Churchin vuonna 1932 kehittämää lambdakalkyylia. Vaikka lambdakalkyylia ei suunniteltukaan suoritettavaksi tietokoneella, toimi se pohjana moderneille funktionaalisille ohjelmointikielille. [6] Lambdakalkyyli on matemaattinen malli, joka formalisoi laskettavissa olevat funktiot, ja sen avulla voidaankin esittää mikä tahansa laskettavissa oleva funktio yksinkertaisia primitiivejä ja laskusääntöjä käyttäen [18]. Ensimmäinen varsinainen funktionaalinen ohjelmointikieli oli 1950-luvulla John Mc- Carthyn kehittämä Lisp. Se kehitettiin alunperin listojen käsittelyä varten teko-

10 3.2. Haskell 7 älytutkimuksen tarpeisiin. Lisp ei ollut puhtaasti funktionaalinen, sillä se sisälsi muun muassa sijoitusoperaation sekä muita sivuvaikutuksen sisältäviä operaatioita luvulla kehitetty ML-kieli toi funktionaaliseen ohjelmointiin Hindley Milnertyyppijärjestelmän, joka on myöhemmin otettu käyttöön kaikissa staattisesti tyypitetyissä funktionaalisissa ohjelmointikielissä, kuten Haskellissa. ML oli staattisesti tyypitetty kieli, jossa tyypit pääteltiin automaattisesti ilman eksplisiittisiä tyyppimäärittelyitä (engl. type inference). Tyyppijärjestelmä mahdollisti ohjelmoijan itse määrittelemät tietotyypit sekä polymorfiset funktiot. [6] 3.2 Haskell Haskell on staattisesti tyypitetty, puhtaasti funktionaalinen ja laiskasti evaluoitu ohjelmointikieli [12]. Haskellin kehitys alkoi vuonna 1987 ja ensimmäinen versio julkaistiin vuonna 1990 [7]. Haskellissa funktiot ovat puhtaita (engl. pure funtion) eli niillä ei voi olla sivuvaikutuksia. Haskell-kääntäjä osaa päätellä lausekkeiden tyypit käännösaikana, joten ohjelmoijan ei tarvitse kirjoittaa niitä itse. Koska Haskellissa on käytössä paljon korkean tason abstraktioita, ovat ohjelmat usein imperatiivisia vastineitaan lyhyempiä. [12] Esimerkiksi quicksort-algoritmin toteutus on vain kuusi riviä pitkä: 1 quicksort :: (Ord a) => [a] -> [a] 2 quicksort [] = [] 3 quicksort ( p: xs) = ( quicksort smaller ) ++ [ p] ++ ( quicksort greater ) 4 where 5 smaller = f i l t e r (< p) xs 6 greater = f i l t e r ( >= p) xs Kyseinen toteutus ei ole yhtä tehokas, kuin hyvin optimoitu C-kielinen vastine. Se on kuitenkin yleisesti käytetty esimerkki Haskellin eleganttiudesta [12]. Haskellin syntaksi saattaa tuntua aluksi oudolta, joten seuraavaksi on selitetty pääpiirteissään edellisen koodiesimerkin rakenne. Ensimmäisellä rivillä on määritelty quicksort-funktion tyyppi; sen parametrit ja paluuarvo. Määrittely [a] -> [a] tarkoittaa, että funktio ottaa parametrinaan listan arvoja ja palauttaa listan samantyyppisiä arvoja. Funktion paluuarvon tyyppi on nuolilla erotetun listan viimeinen osa. Rajoitus (Ord a) => rajoittaa lista-alkioiden tyypin olemaan ainoastaan järjestettävissä olevaa tyyppiä (Ord-tyyppiluokan instanssi). Riveillä 2 6 on määritelty funktion toteutus käyttäen hyväksi hahmonsovitusta. Hahmonsovitus tarkoittaa funktion toteutuksen valitsemista annettujen parametrien perusteella. Rivillä 2 on määritelty järjestetyn listan olevan tyhjä lista ([]), jos parametrina on annettu tyhjä lista. Rivillä 3 parametrina annettu lista on purettu listan ensimmäiseen

11 3.3. Hyödyt 8 alkioon p ja listan loppuosaan xs, jonka jälkeen tulos on määritelty rekursiivisesti käyttäen where-osassa määriteltyjä apufunktioita. Apufunktiot eivät ole näkyvissä quicksort-funktion ulkopuolella. 3.3 Hyödyt Nimensä mukaisesti funktionaalisessa ohjelmoinnissa funktiot ovat keskeisessä asemassa. Funktiot ovat aivan kuten mitkä tahansa muutkin arvot (engl. first-class citizen), joten niitä voidaan välittää parametreina toisille funktioille ja käyttää funktioiden paluuarvoina. Funktioiden käsitteleminen arvoina mahdollistaa ohjelman pilkkomisen hyvin pieniin geneerisiin osiin, joita yhdistelemällä päästään haluttuun lopputulokseen. Esimerkiksi listan järjestämiseen käytettävälle funktiolle voidaan antaa parametrina funktio, jota käytetään alkioiden vertailemiseen. Järjestämisfunktiota voidaan siten helposti käyttää erilaisten listojen järjestämiseen vain vaihtamalla käytettävää vertailufunktiota. [8, 14] Ohjelman logiikan seuraaminen on helpompaa kuin proseduraalisessa ohjelmoinnissa, sillä kaikki funktiot ovat puhtaita. Haskellissa millään funktiolla ei ole koskaan sivuvaikutuksia, joten funktion arvo riippuu vain ja ainoastaan annetuista parametreista. Tätä ominaisuutta kutsutaan viiteläpinäkyvyydeksi (engl. referential transparency). Viiteläpinäkyvyys takaa, että jos funktiota kutsutaan useamman kerran samoilla parametreilla, on tulos joka kerralla sama. Tämä tekee ohjelman toiminnan ymmärtämisestä helppoa sekä ohjelmoijalle että kääntäjälle. [12] Viiteläpinäkyvyys mahdollistaa myös koodin optimointeja. Esimerkiksi Haskellkääntäjä voi jättää funktiokutsun lopputuloksesta pois, jos täysin samanlainen kutsu on jo tehty aikaisemmin, sillä se tietää varmaksi, että toisen kutsun lopputulos on sama kuin ensimmäisen [10]. Viiteläpinäkyvyyden ansiosta ohjelman jakaminen pienempiin, uudelleenkäytettäviin osiin on helppoa. Tämä vähentää toistoa ja edelleen koodin määrää. Lyhyemmät ohjelmat ovat helpommin hallittavia ja niissä on vähemmän bugeja. [12] Kun funktion arvo riippuu vain sille annetuista parametreista, voidaan se suorittaa milloin vain. Ohjelman suorituskykyä voidaan siis parantaa suorittamalla peräkkäisiä funktiokutsuja rinnakkain. [8] 3.4 Haasteet Funktionaalisessa ohjelmoinnissa on monia ominaisuuksia, jotka tekevät ohjelmista toimintavarmempia ja helpommin ymmärrettäviä. Funktionaalinen ohjelmointi saat-

12 3.4. Haasteet 9 taa kuitenkin tuntua hankalalta proseduraaliseen ohjelmointiin tottuneen ohjelmoijan näkökulmasta. Uuden ohjelmointikielen opetteluun liittyy lähes aina uuden syntaksin opettelu. Syntaksin lisäksi uuden ohjelmointiparadigman opettelu vaatii, että ohjelmoija omaksuu uuden tavan lähestyä ongelmia. Tässä luvussa käsitellään muutamia funktionaaliselle ohjelmoinnille tyypillisiä käsitteitä, jotka saattavat olla aloittelevalle ohjelmoijalle haastavia. Tähän työhön on valittu tarkasteltaviksi rekursio, korkeamman asteen funktiot sekä monadit. Valinta perustuu kirjoittajan omiin kokemuksiin funktionaalisen ohjelmoinnin opettelusta. Nämä konseptit tulevat kuitenkin usein esille myös muiden kokemuksissa [17, 3, 13], ja erityisesti rekursion haastavuutta on tutkittu aikaisemmin [5, 4] Rekursio Koska funktionaalisessa ohjelmoinnissa ei ole mahdollista muuttaa muuttujien arvoja, ei proseduraalisesta ohjelmoinnista tuttuja silmukkarakenteita voida käyttää. Funktionaalisissa ohjelmointikielissä toisto tulee toteuttaa rekursion avulla. Monissa kielissä on tarjolla funktioita, kuten map, foldl ja zip, listojen käsittelyyn, mutta nekin on toteutettu rekursion avulla. Yksinkertainen esimerkki rekursiosta on kokonaislukulistan summan laskeminen, joka voidaan toteuttaa seuraavasti: 1 sum :: [ Int ] -> Int 2 sum [] = 0 3 sum (n:ns) = n + sum ns Summausoperaatio on määritelty rekursiivisesti. Rivit 2 ja 3 määrittelevät funktion paluuarvon eri parametreilla. Rivillä 2 on määritelty rekursion lopetusehto: tyhjän listan summa on 0. Jos lista ei ole tyhjä, siirrytään riville 3, jossa listan summa on määritelty rekursiivisesti: summa on ensimmäisen alkion n ja listan loppuosan ns summa. Rekursion ymmärtäminen on kuitenkin vaikeaa proseduraalista ohjelmointia opiskelleille. Rekursiota opetetaan ohjelmoinnin peruskursseilla yleensä melko myöhäisessä vaiheessa. Opetus on konkreettista ja perustuu rekursion suorituksen ymmärtämiseen, jolloin abstraktimpi ongelman rekursiivinen hahmottaminen jää vähemmälle huomiolle. [4] Rekursiivisia funktioita määriteltäessä on tärkeää määritellä rekursiolle lopetusehto, jotta suoritus ei jatku loputtomiin. Tällaisen lopetusehdon tunnistaminen on monelle rekursioon tottumattomalle haastavaa. Huono lopetusehdon valinta voi myös johtaa tarpeettoman monimutkaiseen toteutukseen. [5]

13 3.4. Haasteet Korkeamman asteen funktiot Kuten luvussa 3.3 todettiin, funktiot ovat tyypillisesti samanarvoisia kuin muutkin datatyypit, mikä mahdollistaa tehokkaiden abstraktioiden luomisen. Funktioiden parametrit sekä paluuarvot voivat siis olla myös toisia funktioita. Uusien funktioiden määritteleminen soveltamalla osittain (engl. partial application) olemassa olevaa funktiota on tärkeä työkalu. Esimerkiksi Haskell-kielessä funktio voi ottaa maksimissaan yhden parametrin. Useita parametreja vastaanottavat funktiot ottavatkin todellisuudessa vastaan yhden parametrin ja palauttavat funktion, joka ottaa parametrinaan yhden parametrin ja palauttaa funktion, joka ottaa parametrinaan yhden parametrin ja niin edelleen. [12] Esimerkiksi min-funktion tyyppi 1 min :: (Ord a) => a -> a -> a voidaan lukea: min ottaa parametrinaan kaksi järjestettävän tyyppistä arvoa ja palauttaa yhden samantyyppisen arvon. Sama tyyppimäärittely voidaan kirjoittaa ekvivalentisti muodossa 1 min :: (Ord a) => a -> (a -> a) jolloin siitä nähdään helpommin, että todellisuudessa min ottaa vastaan vain yhden parametrin ja palauttaa funktion. Kun funktiota kutsutaan seuraavasti 1 min 2 4 todellisuudessa kutsu tapahtuukin seuraavasti 1 (min 2) 4 Ensimmäiseksi siis kutsutaan min-funktiota vain parametrilla 2. Tämä palauttaa funktion, joka vertailee parametrina annettua lukua lukuun 2 ja palauttaa pienemmän. Tätä funktiota kutsutaan parametrilla 4 ja palautetaan tulos. Funktioiden osittainen soveltaminen saattaa tuntua aluksi vaikealta konseptilta, mutta se kuitenkin auttaa jakamaan ohjelmaa pienempiin uudelleenkäytettäviin osiin. Esimerkiksi funktio, joka kertoo listan kaikki luvut kahdella, voidaan määritellä seuraavasti: 1 doublelist :: (Num a) => [a] -> [a] 2 doublelist = map ((*) 2) Määrittelyssä on hyödynnetty funktion osittaista kutsumista kahteen kertaan. Kutsumalla kertolaskufunktiota vain parametrilla 2 luodaan funktio, joka kertoo parametrina annetun luvun kahdella. Funktiota map kutsutaan antaen parametrina tämä

14 3.4. Haasteet 11 funktio, jolloin se palauttaa funktion, joka kertoo kaikki annetun listan luvut kahdella. (Lausekkeen (*) 2 ympärillä olevat sulut voidaan jättää pois käyttämällä funktionsoveltamisoperaattoria $, joka olisi kenties Haskellille tyypillisempi tapa. Sulut on jätetty esimerkkiin selvyyden vuoksi.) Ilman funktion osittaista soveltamista doublelist-funktion määrittely voisi näyttää seuraavalta: 1 doublelist xs = map (\ x - > 2 * x) xs Funktion tyyppimäärittely on jätetty toistamatta. Määrittely on hieman pidempi kuin osittaista soveltamista käytettäessä. Parametrina annettu lista xs on tarpeettomasti kirjoitettu auki, ja myös kertolaskuoperaatio on avattu lambdafunktioksi. Esimerkin mukainen toteutus saattaa tuntua luontevammalta funktionaalista ohjelmointia aloittelevalle Sivuvaikutuksien esittäminen Kuten aikaisemmin on todettu, puhtailla funktioilla ei voi olla sivuvaikutuksia. Sivuvaikutuksia tarvitaan kuitenkin moniin tavallisiin operaatioihin, jotka käsittelevät jotain ohjelman ulkopuolisia resursseja. Tällaisia operaatioita ovat esimerkiksi tekstin tulostus tai levyllä olevan tiedoston lukeminen. Tarvitaan siis jokin tapa esittää sivuvaikutuksia, jotta funktionaalisella ohjelmointikielellä voidaan toteuttaa käytännöllisiä ohjelmia. Seuraavassa perehdytään hieman Haskellin tapaan esittää sivuvaikutuksia. Haskellissa sivuvaikutusten esittäminen on toteutettu monadien ja IO a -tietotyypin avulla. IO a on tietotyyppi, joka kuvaa jotakin toimintoa, joka suoritettaessa aiheuttaa sivuvaikutuksen ja tuottaa a-tyyppisen tuloksen [9]. Esimerkiksi tiedostonlukufunktion tietotyyppi 1 readfile :: FilePath -> IO String tarkoittaa, että kun sitä kutsutaan, se palauttaa toiminnon, joka suoritettaessa tuottaa tuloksenaan merkkijonon, tässä tapauksessa tiedoston sisällön. Itse funktion kutsuminen ei siis vielä aiheuta sivuvaikutuksia, sillä se vain palauttaa toiminnon, jolla on sivuvaikutuksia. IO-toimintoja voi Haskellissa suorittaa vain mainfunktio. [9] IO-tietotyypin taustalla on monadi. Monadit ovat tapa liittää arvoon jokin konteksti sekä soveltaa funktioita näille arvoille konteksti huomioon ottaen [12]. Puhtaasti funktionaalisissa ohjelmointikielissä kaiken datan välityksen täytyy tapahtua eksplisiittisesti, sillä sivuvaikutuksia ei sallita. Tällä on, kuten luvussa 3.3

15 3.4. Haasteet 12 todettiin, hyviä puolia, mutta se saattaa myös toisinaan vaikeuttaa ohjelman toteutusta. Esimerkiksi, jos haluttaisiin pitää kirjaa jonkin operaation suorituskertojen lukumäärästä, tulisi tämän arvo välittää ja palauttaa aina eksplisiittisesti funktiosta toiseen. Proseduraalisessa ohjelmointikielessä laskuri voisi olla globaali muuttuja, jonka arvoa muutetaan tarvittaessa. Monadit mahdollistavat muun muassa arvojen kuljettamisen funktiosta toiseen. [20] Haskellissa IO a on monadi, jonka avulla ohjelman ulkopuolista tilaa kuljetetaan ohjelman suorituksen mukana. Ohjelma saa tilan main-funktiota kutsuttaessa, jonka jälkeen se kulkee IO-toimintojen mukana läpi ohjelman. [10] Monadien avulla voidaan ketjuttaa operaatioita, jotka saattavat tuottaa virheitä ilman, että edellisen operaation virheellisyyttä tarvitsee erikseen tarkistaa [20]. Monadit ovat hyödyllisiä työkaluja funktionaalisessa ohjelmoinnissa, ja niiden ymmärtäminen helpottaa muun muassa io-operaatioiden käyttämistä. Erilaisia oppaita, jotka pyrkivät selittämään monadien käsitettä ja käyttöä, on internetissä paljon [15], joten se vaikuttaisi olevan monille haastavaa. Tämä johtuu todennäköisesti siitä, että vastaavaa rakennetta ei tavallisesti ole olemassa proseduraalisessa tai olioohjelmoinnissa, sillä sille ei ole tarvetta.

16 13 4. OHJELMOINTIPROJEKTI Ohjelmointiprojektina toteutettiin Haskellilla web-palvelinsovellus, jolta voidaan kysyä TTY:n ruokaloiden ruokalistat valitulle päivälle. Ohjelmalla on yksinkertainen HTTP-rajapinta, jonka kautta ruokalistat palautetaan JSON-muodossa. Ruokalistan hakeminen tapahtuu lähettämällä HTTP GET -pyyntö palvelimelle polkuun /YYYY-MM-DD, jossa YYYY-MM-DD on haluttu päivämäärä ISO muodossa. Esimerkiksi marraskuun 21. päivän 2017 ruokalistat saataisiin pyynnöllä 1 GET http :// < osoite >/ / Ruokalistojen tiedot haetaan ravintoloiden omista rajapinnoista ja muokataan yhtenäiseen muotoon. Ohjelman toteutus voidaan jakaa kahteen osaan: HTTP-pyyntöjen käsittelyyn sekä ruokalistadatan hakemiseen ja muokkaamiseen. HTTP-pyyntöjen käsittely hoitaa halutun päivämäärän parsimisen annetusta URL:stä. Kun päivämäärä on tiedossa, voidaan kutsua funktioita, joilla ruokalistat haetaan. Jokaista ravintoloitsijaa varten on oma moduulinsa, jossa on toteutettu ruokalistojen hakeminen kyseisen ravintoloitsijan rajapinnasta. Näiden moduulien rajapintoina toimivat uudet tietotyypit, jotka toteuttavat tyyppiluokan 1 c l a s s FoodService a where 2 getrestaurantsdata :: a - > Campus -> UTCTime - > IO [ Restaurant ] HTTP-rajapinnan palauttaman datan rakenne on määritelty luomalla uudet tietotyypit jokaiselle JSON-objektille. Esimerkiksi ruokalaji voidaan esittää seuraavien tietotyyppien avulla: 1 data MealContent = MealContent { name :: String 2, diets :: [ String ] 3 } deriving ( Generic, Show) 4 5 data Meal = Meal { name :: String 6, prices :: [ String ] 7, contents :: [ MealContent ] 8 } deriving ( Generic, Show) Vastaavalla tavalla on määritelty eri rajapinnoista saatavien ruokalistatietojen formaatit. Näiden parsiminen JSON-formaatista sekä vastauksen enkoodaminen JSON-

17 4. Ohjelmointiprojekti 14 muotoon on yksinkertaista aeson-kirjaston [1] avulla. Geneerisyyden ansiosta FromJSONja ToJSON-tyyppiluokkien oletustoteutukset ovat riittävät parsimisen ja enkoodauksen toteuttamiseen, jolloin edellämainituista rakenteista saadaan JSON-muotoon muutettavia lisäämällä rivit 1 instance ToJSON MealContent 2 instance ToJSON Meal Kun data on muutettu JSON-muodosta itsemääriteltyihin tietotyyppeihin, on sitä helppo käsitellä. Funktioiden käsittely arvoina tekee listojen käsittelystä miellyttävää. Listojen suodattaminen ja erilaisten datamuunnosten tekeminen listan alkioille on map- ja filter-funktioiden avulla helppoa ja ilmaisuvoimaisempaa kuin vastaavilla silmukkarakenteella. Proseduraalisessa ohjelmoinnissa nämä muunnokset jouduttaisiin tekemään esimerkiksi for-silmukoiden avulla. Jos funktioita ei voitaisi välittää parametreina toisille funktioille, tulisi koodiin paljon toistoa, sillä lähes samanlaisia for-silmukoita jouduttaisiin toistamaan useassa kohdassa. HTTP-pyyntöjen käsittely tapahtuu ohjelman main-funktiossa. Pyyntöjen käsittelyyn valittiin käytettäväksi scotty-kirjasto [19], sillä se vaikutti todella yksinkertaiselta käyttää. Seuraavassa koodiesimerkissä on ohjelman main-funktio kokonaisuudessaan 1 main = scotty 3000 $ 2 get "/: date " $ do 3 datestring <- param " date " 4 l e t date = isotoutctime datestring 5 6 sodexodata <- liftio $ getrestaurantsdata Sodexo TUT date 7 fazerdata <- liftio $ getrestaurantsdata Fazer TUT date 8 juvenesdata <- liftio $ getrestaurantsdata Juvenes TUT date 9 10 l e t alldata = concat [ sodexodata, fazerdata, juvenesdata ] 11 response = APIResponse { restaurants = alldata } json $ response Ohjelma 4.1 Toteutetun ohjelman main-funktio Projektissa ei ollut tarvetta kirjoittaa itse rekursiivisia funktioita. Suurimmat vaikeudet toteutuksessa olivat IO-tyyppien käsittelyssä. Työssä onnistuttiin kuitenkin melko hyvin eristämään niiden käsittely vain pieneen osaan funktioista. Loput funktioista ovat täysin puhtaita. Funktioiden osittaisen soveltamisen mahdollisuus unohtui useaan kertaan, ja joistakin apufunktioista tuli aluksi tarpeettoman monimutkaisia. Projektin edetessä tämä väheni kuitenkin huomattavasti. Kokonaisuudessaan

18 4. Ohjelmointiprojekti 15 projektin toteutus funktionaalisella ohjelmointikiellä tuntui mielekkäältä. Haskellin vahva tyypitys tuo varmuutta, sillä jos ohjelma kääntyy, se todennäköisesti myös toimii oikein, eikä kaadu.

19 16 5. YHTEENVETO Funktionaalinen ohjelmointi tarjoaa paljon hyödyllisiä ominaisuuksia. Proseduraalisesta ohjelmoinnista funktionaaliseen ohjelmointiin siirtyminen ei kuitenkaan ole täysin vaivatonta. Funktionaaliseen ohjelmointiin kuuluu olennaisena osana ratkaisumalleja ja rakenteita, joita ei proseduraalisessa ja olio-ohjelmoinnissa käytetä yhtä usein. Tähän työhön valittiin käsiteltäväksi kolme funktionaalisessa ohjelmoinnissa haastavaa aihetta: rekursio, korkeamman asteen funktiot sekä sivuvaikutusten esittäminen. Rekursio on monille varsinkin aluksi hankala käsite, sillä sen osuus monilla ohjelmointikursseilla jää vähäiseksi. Opetus usein myös keskittyy enemmän rekursion suorituksen ymmärtämiseen kuin ongelman rekursiivisen ratkaisun hahmottamiseen. Funktioiden välittäminen parametreina toisille funktioille ei ole mahdollista kaikissa proseduraalisissa ohjelmointikielissä, joten korkeamman asteen funktiot saattavat tuntua vaikeilta funktionaalista ohjelmointia aloittelevalle. Samoin funktion osittainen soveltaminen on tyypillisesti vain funktionaalisten ohjelmointikielten ominaisuus. Funktioiden puhtaudesta johtuen sivuvaikutusten esittämistä varten tulee funktionaalisessa ohjelmoinnissa olla mekanismeja, kuten monadit, joita ei ole proseduraalisissa ohjelmointikielissä. Tällaisten täysin uusien konseptien opetteleminen ja sisäistäminen on usein vaativaa. Työhön valitut kolme aihetta eivät varmastikaan ole ainoat haasteet funktionaalisessa ohjelmoinnissa. Kandidaatintyön laajuuden takia rajaus oli kuitenkin pidettävä kohtalaisen suppeana, ja valitut aiheet ovat kirjoittajan mielestä tärkeitä. Samoja aiheita on käsitelty myös muiden kirjoittamissa teksteissä, joten työn tulokset ovat ainakin jossain määrin yleistettävissä.

20 17 LÄHTEET [1] aeson: Fast JSON parsing and encoding Saatavissa (viitattu ): [2] T. Budd, An introduction to object-oriented programming, 3rd, Addison- Wesley, Boston, [3] D. Fayram, Functional Programming Is Hard, That s Why It s Good, Oct Saatavissa (viitattu ): 19-lets-go-shopping.html. [4] D. Ginat, E. Shifroni, Teaching Recursion in a Procedural Environment How Much Should We Emphasize the Computing Model?, The Proceedings of the Thirtieth SIGCSE Technical Symposium on Computer Science Education, SIGCSE 99, ACM, New Orleans, Louisiana, USA, 1999, pp [5] B. Haberman, H. Averbuch, The Case of Base Cases: Why Are They So Difficult to Recognize? Student Difficulties with Recursion, SIGCSE Bull., Vol. 34, Iss. 3, June 2002, pp [6] P. Hudak, Conception, evolution, and application of functional programming languages, ACM Computing Surveys (CSUR), Vol. 21, Iss. 3, 1989, pp [7] P. Hudak et al., A History of Haskell: Being Lazy with Class, Proceedings of the Third ACM SIGPLAN Conference on History of Programming Languages, HOPL III, ACM, San Diego, California, 2007, pp [8] J. Hughes, Why Functional Programming Matters, The Computer Journal, Vol. 32, Iss. 2, 1989, pp [9] Introduction to IO - HaskellWiki, July 2017 Saatavissa (viitattu ): [10] IO inside - HaskellWiki, May 2015 Saatavissa (viitattu ): https: //wiki.haskell.org/io_inside. [11] B. Jan, Programming Language Paradigms & The Main Principles of Object- Oriented Programming, CRIS: Bulletin of the Centre for Research and Interdisciplinary Study, Vol. 2014, Iss. 1, 2014, pp [12] M. Lipovaca, I. Books24x7, Learn You a Haskell for Great Good! : A Beginner s Guide, 1st ed., No Starch Press,US, San Francisco, 2011 Saatavissa: http: //learnyouahaskell.com/chapters.

21 LÄHTEET 18 [13] M. Mahto, Does Functional Programming scare you?, Mar Saatavissa (viitattu ): [14] A. S. Mena, I. Books24x7, Beginning Haskell : A Project-Based Approach, 1st ed., Apress, Berkeley, CA, [15] Monad tutorials timeline - HaskellWiki, Nov Saatavissa (viitattu ): [16] K. Nørmark, Paradigms, July 2013 Saatavissa (viitattu ): http: //people.cs.aau.dk/~normark/prog3-03/html/notes/paradigms_themesparadigms.html. [17] J. Reem, Functional Programming is Black Magic, Nov Saatavissa (viitattu ): [18] R. Rojas, A Tutorial Introduction to the Lambda Calculus, CoRR, [19] scotty: Haskell web framework inspired by Ruby s Sinatra, using WAI and Warp Saatavissa (viitattu ): scotty. [20] P. Wadler, Monads for functional programming, in: J. Jeuring, E. Meijer (eds.) Advanced Functional Programming: First International Spring School on Advanced Functional Programming Techniques, Båstad, Sweden, May 24 30, 1995 Tutorial Text, Springer Berlin Heidelberg, Berlin, Heidelberg, 1995, pp

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 4: Symbolit, derivojaesimerkki, kierroksen 1 ratkaisut (mm. SICP 2.32.3.2) Riku Saikkonen 1. 11. 2011 Sisältö 1 Symbolit ja sulkulausekkeet 2 Lisää Schemestä:

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

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

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

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

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

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

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

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

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014 18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

Bootstrap / HTDP2 / Realm of Racket. Vertailu

Bootstrap / HTDP2 / Realm of Racket. Vertailu Bootstrap / HTDP2 / Realm of Racket Vertailu Bootstrap http://www.bootstrapworld.org/ Tarkoitettu yläkoululaisille (12-15v) Ohjelmointi on integroitu matematiikan opetukseen Materiaalina tuntisuunnitelmat

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

Funktionaalinen ohjelmointi

Funktionaalinen ohjelmointi hyväksymispäivä arvosana arvostelija Funktionaalinen ohjelmointi Eeva Terkki Helsinki 10.12.2012 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY

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

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

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

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

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

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

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

Monadeja siellä, monadeja täällä... monadeja kaikkialla? TIES341 Funktio ohjelmointi 2 Kevät 2006 Monadeja siellä, monadeja täällä... monadeja kaikkialla? TIES341 Funktio ohjelmointi 2 Kevät 2006 Materiaalia Paras verkkomatsku: http://www.nomaware.com/monads/html/ Komentoanalogiasta vielä Monadityypin

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

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

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä

Lisätiedot

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

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki Sisällys JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta Abstrakti luokka ja metodi Rajapintamäärittely (interface) Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto 13.10.2000 E.

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

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 9.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 9.2.2009 1 / 35 Listat Esimerkki: halutaan kirjoittaa ohjelma, joka lukee käyttäjältä 30 lämpötilaa. Kun lämpötilat

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Taulukot: Array Taulukko Javassa pitää aina perustaa (new) Yksinkertaisessa tilanteessa taulukon koko tiedetään etukäteen ja

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

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

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

AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin Raimo Nikkilä Aalto-yliopiston sähkötekniikan korkeakoulu - Automaation tietotekniikan tutkimusryhmä 17. tammikuuta 2013

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

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 1: Rekursiivinen ajattelutapa, Scheme-kielen perusteita (mm. SICP 11.2.4) Riku Saikkonen 16. 10. 2012 Sisältö 1 Kurssijärjestelyitä 2 Perusteita Scheme-kielestä,

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

Järjestelmäarkkitehtuuri (TK081702)

Järjestelmäarkkitehtuuri (TK081702) Järjestelmäarkkitehtuuri (TK081702) yleistyvät verkkopalveluissa Youtube Google... Avaavat pääsyn verkkopalvelun sisältöön. Rajapintojen tarjoamia tietolähteitä yhdistelemällä luodaan uusia palveluja,

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

Imperatiivisten ohjelmien organisointiparadigmojen. historia

Imperatiivisten ohjelmien organisointiparadigmojen. historia Imperatiivisten ohjelmien organisointiparadigmojen historia Timo Tapanainen Helsingin yliopisto, tietojenkäsittelytieteen laitos Tietojenkäsittelytieteen historia -seminaari, kevät 2007 Sisältö Paradigma,

Lisätiedot

Imperatiivisten ohjelmien organisointiparadigmojen historia

Imperatiivisten ohjelmien organisointiparadigmojen historia Imperatiivisten ohjelmien organisointiparadigmojen historia Timo Tapanainen Helsingin yliopisto, tietojenkäsittelytieteen laitos Tietojenkäsittelytieteen historia -seminaari, kevät 2007 Sisältö Paradigma,

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 16.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 16.3.2009 1 / 40 Kertausta: tiedostosta lukeminen Aluksi käsiteltävä tiedosto pitää avata: tiedostomuuttuja = open("teksti.txt","r")

Lisätiedot

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena Ohjelmointikielet ja -paradigmat 5op Markus Norrena Ko#tehtävä 4 Viimeistele "alkeellinen kuvagalleria". Käytännössä kaksi sivua Yksi jolla voi ladata kuvia palvelimelle (file upload) Toinen jolla ladattuja

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Kurssin sisältö pääpiirteittäin Tarvittavat pohjatiedot Avainsanat Abstraktio Esimerkkiohjelman tehtäväkuvaus Abstraktion käyttö tehtävässä Abstrakti tietotyyppi Hyötyjä ADT:n

Lisätiedot

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004 Vertailulauseet Ehtolausekkeet Ehdot, valintalausekkeet Boolean-algebra == yhtäsuuruus!= erisuuruus < pienempi suurempi >= suurempi tai yhtäsuuri Esimerkkejä: int i=7; int j=10;

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

Ohjelmoinnin perusteet Y Python

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

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

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

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

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

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 81122P (4 ov.) 30.5.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan

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

Groovy. Samuli Haverinen, Aki Hänninen. 19. marraskuuta 2015

Groovy. Samuli Haverinen, Aki Hänninen. 19. marraskuuta 2015 Groovy Samuli Haverinen, Aki Hänninen 19. marraskuuta 2015 Groovy on oliokieli Java-alustalle (käännetään/tulkataan Java-tavukoodiksi), jonka syntaksi on hyvin Java-ystävällinen ja jota voidaan käyttää

Lisätiedot

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi Imperatiivisen ohjelmoinnin peruskäsitteet muuttuja muuttujissa oleva data voi olla yksinkertaista eli primitiivistä (esim. luvut ja merkit) tai rakenteista jolloin puhutaan tietorakenteista. puhuttaessa

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

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

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

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

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Aloitusluento Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 7. tammikuuta 2008 Aikataulu Luennot salissa Ag C231.1: ma klo 10 12, to klo 14-16

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

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

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

Harjoitustyö: virtuaalikone

Harjoitustyö: virtuaalikone Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman

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

Tiina Partanen. Koodaamassa Matikantunnilla

Tiina Partanen. Koodaamassa Matikantunnilla Koodaamassa Matikantunnilla Racket-iskuryhmä? Ryhmä Tamperelaisia ja Ylöjärveläisiä opettajia, jotka testaavat ja kehittävät Racket-ohjelmointimateriaalia yläkoulun matematiikan (tietotekniikan ja fysiikan)

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 9 Kombinaattoreista Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 Currying Haskell-funktio ottaa aina vain yhden

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

1. Omat operaatiot 1.1

1. Omat operaatiot 1.1 1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

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

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

812341A Olio-ohjelmointi Peruskäsitteet jatkoa 812341A Olio-ohjelmointi 2106 Peruskäsitteet jatkoa Luokkakohtaiset piirteet n Yhteisiä kaikille saman luokan olioille n Liittyvät luokkaan, eivät yksittäiseen olioon n Kaikki ko. luokan oliot voivat käyttää

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2011 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2011 1 / 39 Kertausta: tiedoston avaaminen Kun ohjelma haluaa lukea tai kirjoittaa tekstitiedostoon, on ohjelmalle

Lisätiedot

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen

Lisätiedot

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1 12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu

Lisätiedot

Osoitin ja viittaus C++:ssa

Osoitin ja viittaus C++:ssa Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja

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

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

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 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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 1: SICP luku 1 Riku Saikkonen 1. 11. 2010 Sisältö 1 Kurssijärjestelyitä 2 SICP-kirjasta 3 Häntärekursio 4 Rekursio 5 Funktiot argumentteina 6 Funktiot

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 25.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 25.2.2009 1 / 34 Syötteessä useita lukuja samalla rivillä Seuraavassa esimerkissä käyttäjä antaa useita lukuja samalla

Lisätiedot