582315: Johdatus funktionaaliseen ohjelmointiin (4 op), kevät 2009
Kurssilla perehdytään ohjelmointityyliin, jossa vältetään sijoitusten tai muiden sivuvaikutusten käyttöä ja pyritään esittämään käsitteitä arvoina ja niiden välisinä funktioina. Samalla tutustutaan Haskell-ohjelmointikieleen, joka soveltuu tällaiseen tyyliin erityisen hyvin.
- Valinnainen kurssi, laajuudeltaan 4 op.
- Luennot 14.1.-19.2. ke, to 12-14 B123, Lauri Alanko ja Joel Kaasinen
- Laskuharjoitusryhmät:
- HUOM! Ensimmäisellä viikolla mikroluokassa B221
- Pe 12-14 B221 (16.1.), Ti 12-14 C222 (20.1.-17.2.) Aki Reijonen
- Uusi ryhmä!
- Huomaa: ensimmäisellä viikolla perjantaina, sen jälkeen tiistaisin
- To 16-18 B221 (15.1.), CK111 (22.1.-19.2.) Aki Reijonen
- Pe 14-16 B221 (16.1.), B119 (23.1.-20.2.) Ilmari Vacklin
- Kurssikoe to 26.2. klo 16-19 A111
- Koekysymykset
- Kokeen ohessa annetut kirjastomäärittelyt
- Mallivastaukset ja niiden lähdekoodi
- Arvosteluperusteet
- Erillis/uusintakoe ti 31.3. klo 16-20 A111
- Tämä on viimeinen koe jossa laskuharjoituksista saatavat bonuspisteet vielä huomioidaan. Koe toimii samalla sekä erilliskokeena että luentokurssin uusintakuulusteluna. Koealueena on sen vuoksi joko Nykäsen kalvot kokonaisuudessaan tai luennoilla käsitellyt asiat. Näissä on paljon päällekkäisyyttä, mutta kokeessa voi siis olla myös vaihtoehtoisia tehtäviä, joista toisen aihetta on käsitelty vain luennoilla ja toisen aihetta vain Nykäsen kalvoilla.
- Koekysymykset, niiden lähdekoodi ja ohessa annetut kirjastomäärittelyt
- Mallivastaukset ja arvosteluperusteet ja niiden lähdekoodi (vaatii myös kokeen lähdekoodin samassa hakemistossa)
- Erilliskoe 11.8.2009
- Tehtävät ja mallivastaukset suomeksi.
- Problems and sample solutions in English.
- Lähdekoodi
- Erilliskoe 15.9.2009
- Tehtävät ja mallivastaukset suomeksi.
- Problems and sample solutions in English.
- Lähdekoodi
- Erilliskoe 6.11.2009
- Tehtävät ja mallivastaukset suomeksi.
- Lähdekoodi
- Erilliskoe 30.3.2010
- Tehtävät ja mallivastaukset suomeksi.
- Lähdekoodi
Tulokset
- Luentokurssin tulokset
- Laskuharjoitusten ja kurssikokeen tarkistuslista
- Erillis/uusintakokeen 31.3.2009 tulokset
- Kokeiden arvostelusta voi kysyä mailitse
Esitietovaatimukset
Muodollisena esitietovaatimuksena on Tietorakenteet-kurssi. Erityisesti listojen ja puiden tulisi olla tuttuja käsitteitä. Matematiikan kurssit Algebra I ja Logiikka I ovat myös hyödyllistä taustaa, mutta eivät välttämättömiä.
Suoritustavat
Kurssi voidaan suorittaa luennoilla, laskuharjoituksilla ja kurssikokeella, jotka pidetään keväällä 2009 kolmosperiodissa, tai myöhemmin erilliskokeella.
Luentokurssillakin pelkkään kurssikokeeseen osallistumalla voi jo saada täydet pisteet (60 p). Laskuharjoituksissa voi kuitenkin hakea itselleen lisäpisteitä (max. 12p). Harjoitustilaisuuksia on kuusi, ja kussakin pelkällä läsnäolollakin jo saa yhden pisteen, joten niihin on täysin sallittua osallistua valmistautumattakin.
Oppimateriaali
Ensisijaisena oppimateriaalina toimivat luentokalvot, jotka valmistuvat kurssin aikana. Matti Nykäsen aiemmin pitämän kurssin materiaali on myös hyvä lähde, mutta siinä on hieman erilaiset painotukset kuin tällä kurssilla.
Suosituksia oheislukemistoksi tulee kurssin aikana.
Luennot
- luento 14.1.2009.
- Esityskalvot
- Tulostettava versio tulee pian
- Nykäsen kalvojen ensimmäinen luku käsittelee osittain samoja aiheita laajemmin.
- Luennolla mainittu Composing Contracts-artikkeli. Etenkin kalvojen alkuosa on suhteellisen helppotajuinen.
- Evolution of a Haskell Programmer. Lisää tapoja laskea kertoma.
- luento 15.1.
- luento 21.1.2009
- Aiheina tietotyypit ja polymorfismi. Listojen ja rekursion alkua jos ehditään.
- Kalvot
- Nykäsen kalvojen sivut 249-267, 268-270, 281-285, 151-159.
- luento 22.1.2009
- Rekursio jatkuu? Korkeamman kertaluvun funktiot.
- Kalvot
- Luennoilla käytetty rekursion lajien luokittelu on peräisin How to Design Programs-kirjasta, jonka osat II, III ja V käsittelevät rekursiota varsin perinpohjaisesti.
- luento 28.1.2009
- Tyyppiluokat.
- Luentokalvot
- Nykäsen kalvojen sivut 286-289, 335-361.
- Haskell 98-raportissa tyyppiluokkia käsittelevät luvut 4.1, 4.3, 6.3 ja 6.4.
- luento 29.1.2009
- Virheenkäsittely, tilan hallinta, monadit
- Luentokalvot (hieman korjatut)
- Nykäsen kalvojen sivut 362-364.
- Monad tutorials timeline tarjoaa linkkejä monien eri ihmisten yrityksiin selittää, mitä monadit ovat.
- Real World Haskellin luvut 14 ja 15 tarjoavat vielä yhden kuvauksen.
- luento 4.2.2009
- Epädeterminismi, listakoosteet, MonadPlus
- Kalvot (nyt korjattu)
- Kalvojen koodi erillisenä tiedostona: Luento7.hs
- Nykäsen kalvojen sivut 203-204, 212-219.
- List comprehension Haskell wikissä
- Luennolla mainittuja artikkeleita. Nämä liittyvät luennon aiheisiin vain kaukaisesti.
- Optimizing Object Queries using an Effective Calculus - esimerkki listakoosteiden variantista, monoidikoosteista, joita voi käyttää tietokantahakujen esittämiseen
- Parallel Parsing Processes - esimerkki leveyssuuntaisesta hausta monadeja käyttäen. Tästä saanee paremmin selvää torstain luennon jälkeen.
- luento 5.2.2009
- luento 11.2.2009
- Laiskuus, äärettömät tietorakenteet
- Kalvot
- Nykäsen kalvojen sivut 42-48, 82-84, 99-108, 183-184, 192-202, 388-389, 394-413.
- luento 12.2.2009
- Laiskuus jatkuu
- luento 18.2.2009
- luento 19.2.2009
- Kertausta, erityisaiheita toiveiden mukaan.
- Aihetoiveista voi kertoa wikissä.
Harjoitustehtävät
- Ensimmäisen viikon harjoitustilaisuudet ovat ex tempore-muotoisia, eli ne tehdään paikan päällä mikroluokissa. Riittää siis, että tulee paikalle.
- Viikko 2 (19.-23.1.). Mallivastaukset.
- Viikko 3 (26.-30.1.). Mallivastaukset.
- Viikko 4 (2.-6.2.). Mallivastaukset.
- Viikko 5 (9.-13.2.) Mallivastaukset.
- Viikko 6 (16.-20.2.) Mallivastaukset.
Wiki
Sekalaista lisämateriaalia löytyy kurssin wiki-sivulta.
IRC-kanava
Kurssilla on oma IRC-kanava, #tkt-jfo@IRCnet, jossa voi keskustella kurssin asioista. Myös kurssin opettajat ovat ajoittain paikalla vastaamassa kysymyksiin.
Kurssin sisältöhahmotelma
Seuraavassa on alustava luonnos kurssin rungoksi. Lopullinen sisältö määräytyy kurssin edetessä, ja kaikkia mainittuja aiheita ei varmaankaan ehditä käsitellä.
- Johdanto
- Haskellin esittely
- Yleistä
- leksikaalinen syntaksi
- kommentit
- sisennys
- Modulit
- modulin määrittely
- modulien tuonti
- Lausekkeet
- vakiot
- muuttujat
- funktiokutsut
- infix-operaatiot
- Määrittelyt
- parametrit
- hahmonsovitus
- where-lauseet
- tyyppiannotaatiot
- GHCI
- lausekkeiden tulkitseminen
- paikalliset määrittelyt
- modulien tuonti
- Yleistä
- Aritmetiikka ja rekursio
- Induktiiviset tietotyypit
- Bool
- Uusien tietotyyppien määrittely
- Hahmonsovitus
- Maybe ja monikot
- Polymorfismi
- Rekursiiviset tietotyypit
- Listat ja puut
- Rakenteellinen rekursio
- Korkeamman kertaluvun operaatiot
- Yleiset listaoperaatiot
- Laiskuus ja tehokkuus
- Päättymätön laskenta
- Laiska laskenta
- Tiukat ja löysät parametrit
- Äärettömät ja sykliset tietorakenteet
- (Vuot)
- (Syklinen ohjelmointi)
- (Syöttö ja tuloste laiskoina listoina)
- Jäsentäminen
- Lausekepuut
- Kieliopit
- Merkkijonot listoina
- Epädeterministinen jäsentäminen
- (Fuusio)
- Abstraktit tietotyypit
- Näkyvyyden rajaaminen moduleilla
- Invariantit
- (Haamutyypit)
- (Funktionaaliset tietorakenteet)
- Tyyppiluokat
- Eq, Ord, Enum
- Lämpöiset pörröiset juttuset
- Maybe, List
- (Reader, State)
- I/O
- Kertausta jos ehtii

