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 Luennot pitää assistentti Antti-Juhani Kaijanaho (antti-juhani.kaijanaho@jyu.fi) Demot: sovitaan nyt Demot pitää tutkija Ville Tirronen (aleator@jyu.fi) Luennot + demot: 8 viikkoa (tammi-maaliskuu) Tentit: 28.3., 25.4., 25.7. Luennoijan vastaanottoaika: ke 12-14 (ei ajanvarausta)
Suoritus Tentti ja/tai demot Aktiivinen osallistuminen demoissa tuo korotuksen. 40 % +1 70 % +2 korotus lisätään hyväksytyn tentin arvolauseeseen Huomattava ahkeruus demoissa antaa vapautuksen tentistä 90 % kaikista tehtävistä ja 30 % joka kierroksen tehtävistä tulos automaattinen 5
Kirjallisuus Luentojen pohjana Paul Hudakin The Haskell School of Expression: Learning Functional Programming Through Multimedia Muuta alkeiskirjallisuutta: Graham Hutton: Programming in Haskell Simon Thompson: Haskell: The Craft of Functional Programming Richard Bird: Introduction to Functional Programming using Haskell
Täydentävää kirjallisuutta Fethi Rabhi ja Guy Lapalme: Algorithms: A Functional Programming Approach Chris Okasaki: Purely Functional Data Structures Jeremy Gibbons and Oege de Moor (toimm.): The Fun of Programming Simon Peyton Jones (toim.): Haskell 98 Language and Libraries: The Revised Report
Nettiresursseja!jyu-fp @ IRCnet #haskell @ Freenode http://www.haskell.org/ http://planet.haskell.org/ news:comp.lang.haskell news:comp.lang.functional
Ohjelmointiparadigmat paradigm, n. 1. A pattern or model, an exemplar; (also) a typical instance of something, an example. 2. [... ] 3. [... ] 4. A conceptual or methodological model underlying the theories and practices of a science or discipline at a particular time; (hence) a generally accepted world view. paradigm case n. a case or instance to be regarded as representative or typical. paradigm shift n. a conceptual or methodological change in the theory or practice of a particular science or discipline; (in extended sense) a major change in technology, outlook, etc. (OED draft revision Dec. 2007)
Ohjelmointiparadigmat ja -kielet 1950 IMPERATIIVINEN FORTRAN (pioneeriaika) FUNKTIONAALINEN LISP 1960 ALGOL (rakenteinen ohjelmointi) 1970 C PASCAL ML Scheme SASL 1980 1990 C++ Java (olio ohjelmointi) KRC Miranda Haskell SML OCaml Erlang 2000 C# F#
Funktio-ohjelmointi tuotantokäytössä Google MapReduce Ericssonin puhelinverkkokytkimet Jane Street Capital Galois Darcs
Tulevaisuuden ohjelmointia muistinsiivous (LISP; nyt Java, C#,... ) korkean kertaluvun funktiot (LISP; nyt melkein kaikkialla) geneeriset tyypit (ML; nyt kaikissa moderneissa kielissä) listakomprehensiot (NPL; nyt C#, Python, Perl 6) tyyppiluokat (Haskell; nyt myös C++0x) jotkut klassiset suunnittelumallit (esim. Command, Visitor, Strategy) ovat tapoja tehdä funktio-ohjelmointia oliokielissä = trendi: valtavirta sulautuu funktio-ohjelmoinnin kanssa
Haskell komiteatyönä suunniteltu 1980-luvun lopulla viimeisin standardi Haskell 98 (1999, 2003) työn alla Haskell (Haskell Prime) kohtuullisen tunnettu ja käytetty olennaisesti erilainen valtavirtaan verrattuna aktiivinen tutkimus- ja kehitystyö
Mekaaninen laskenta 3 (9 + 5) 3 14 42 yhteenlasku kertolasku 3 (9 + 5) 3 9 + 3 5 27 + 3 5 27 + 15 42 osittelulaki kertolasku kertolasku Siispä: 3 (9 + 5) = 42
funktio-ohjelma on laskutehtävä laskutehtävä ratkaistaan soveltamalla ongelmaan annettuja laskusääntöjä kunnes tulokseksi tulee arvo yksi askel merkitään lyhyellä nuolella, monta askelta (yhdeksi tiivistettynä) pitkällä nuolella
Funktioabstraktio simple x y z = x (y + z) simple 3 9 5 3 (9 + 5) 3 14 42 simplen soveltaminen yhteenlasku kertolasku Huomaa syntaksi: funktion parametrit/argumentit peräkkäin, ei sulkeita
Todistustekniikkaa simple a b c = a (b + c) simplen soveltaminen = a (c + b) yhteenlaskun vaihdannaisuus = simple a c b simplen abstrahointi (ei nuolta vaan yhtäsuuruus koska nyt ei olla laskemassa vaan osoittamassa samuutta)
funktion soveltaminen on laskusääntö, joka sanoo, että funktiolauseke voidaan korvata ko. funktion määritelmällä funktion abstrahointi on laskusääntö, joka sanoo, että lausekkeen saa korvata funktiolausekkeella käyttämällä funktiota, jonka määritelmä ko. lauseke on
Arvot... ovat laskutoimituksen lopputuloksia... ovat lausekkeita, joihin ei voi enää soveltaa mitään laskusääntöä... voivat olla atomisia: 42, a... voivat olla rakenteisia: [1,2,3] on lista, johon kuuluvat atomiset arvot 1, 2 ja 3 (tässä järjestyksessä ja mahdolliset duplikaatit säilyttäen) "kissa" on merkkijono, johon kuuluvat atomiset arvot k, i, s, s ja a (tässä järjestyksessä ja mahdolliset duplikaatit säilyttäen)
Keskustelua Miksi tulit kurssille? Mitä odotat kurssilta? Mieliala?