Mitä funktionaalinen ohjelmointi on
|
|
- Ilona Saaristo
- 8 vuotta sitten
- Katselukertoja:
Transkriptio
1 Funktionaalinen ohjelmointi Mitä funktionaalinen ohjelmointi on - Funktionaalisessa ohjelmoinnissa mallinnus keskittyy löytämään ongelmasta sellaisia tiedon muunnoksia, jotka voidaan esittää matemaattisina funktioina annetuilta syöttötiedoilta haluttuihin tulostietoihin. - Funktio ottaa sisään informaatioita parametreissaan ja palauttaa informaatioita tuloksessaan. Tulos riippuu vain sisään tulleesta informaatiosta. - Perustuu matemaattiseen funktioteoriaan - Funktiokutsujen arvot riippuvat vain osalausekkeiden arvoista - Sivuvaikutuksia ei ole - Sijoituslausetta ei ole myöskään (paitsi epäpuhtaissa kielissä) - Funktiot ovat "ensimmäisen luokan kansalaisia"
2 - Funktio voi olla toisen funktion argumenttina, paluuarvona ja tietorakenteen alkiona - Voidaan rakentaa sellaisia funktioita, jotka käsittelevät ja palauttavat arvonaan muita funktioita - Vapaa suoritusjärjestys, laiska tai rinnakkainen evaluointi - Implisiittinen muistinhallinta - Ei sijoituslausetta, muuttuja ei voi muuttua - Ei voi tehdä for-silmukkaa, toteutus korvataan rekursiolla - Funktiota ei evaluoida ennen kuin sen parametrit on evaluoitu
3 Funktionaalisen ohjelmoinnin historia kaksi tietojenkäsittelytieteen matemaattisen pohjan muodostavaa laskennan mallia. - Turingin kone (tehtävä T voidaan suorittaa mekaanisesti) - Ohjelman suoritus etenee muuttamalla koneen tilaa käskyjen mukaan -> tietokoneen abstrakti malli - lambda-kalkyyli, jonka pohjalta kehitettiin Lisp-kieli (funktio f on sääntö, jota seuraamalla sen arvo selviää) - Arvon laskenta etenee sieventämällä lauseketta yksinkertaisemmaksi annetuilla säännöillä -> ohjelmointikielen abstrakti malli - Turingin koneet ja lambda-ohjelmat voidaan kääntää toisikseen
4 luvun lopussa ML- ja SML- ohjelmointikielet ((Standard) Meta Language), joihin mm. Haskell perustuu - Alettiin suunnitella tyypit päätteleviä kieliä - Kääntäjä huomaa minkä tyyppisiä tietoalkioita koodissa käsitellään - Ohjelmoijan ei tarvitse kirjoittaa ainakaan kaikkia tyyppejä koodiinsa, kääntäjä osaa konstruoida uusia tyyppejä vanhoja sopivasti yhdistelemällä - Suorituksen eteneminen, ei koskaan jouduta tilanteeseen, jota ei olisi kielen spesifikaatiossa - Tyyppien säilyttäminen, käännösaikana tietoalkioille päätellyt tyypit pysyvät samoina koko suorituksen ajan "No type casts".
5 Miksi funktionaalista ohjelmointia - Kannattaa tuntea erilaisia ohjelmointiparadigmoja, kun ohjelmoija kohtaa ohjelmointiongelmia osaa hän valita kuhunkin ongelmaan sopivimman lähestymistavan. - Funktionaalisessa ohjelmoinnissa painotetaan tiukkoja rajapintoja. Opitaan määrittelemään ohjelma täsmällisesti, soveltamaan rekursiota ja käyttämään generisyyttä. - Painottaa uudelleenkäyttöä - Yhteys matematiikkaan, ohjelma voidaan kirjoittaa vastaamaan määritelmä ja todistaa oikeaksi induktiolla - Kannustaa kokoamaan ohjelmat pienemmistä palasista. Parempi tuki funktioiden käsittelylle, ohjelma voidaan jakaa pienempiin ja yleiskäyttöisempiin ohjelmiin - Ei sivuvaikutuksia
6 Funktionaalisen ja proseduraalisen ohjelmoinnin eroja - Proseduraalisissa eli imperatiivisissa ohjelmointikielissä käskyt suoritetaan järjestyksessä alkaen ensimmäisestä käskystä päättyen viimeiseen. Suoritusjärjestystä voidaan ohjata valinta- ja toistorakenteilla. - Proseduraalisessa ohjelmoinnissa ohjelma pilkotaan aliohjelmiksi, jotka ratkaisevat jonkin yksinkertaisen ongelman. Aliohjelma voi kutsua toista aliohjelmaa. Suuret ohjelmat jaetaan moduuleihin, jotka voivat sisältää useita aliohjelmia. - Funktionaalisessa ohjelmoinnissa asiat esitetään asioiden välisinä relaatioina. Ohjelman rakenne koostuu toisiaan kutsuvista funktioista, jotka muistuttavat matematiikan funktioita, funktion arvo saadaan kun lauseketta sievennetään aina vain yksinkertaisemmaksi.
7 - Puhtaasti funktionaalisessa ohjelmassa kaikki tehdään funktioiden avulla, funktion argumentteihin kohdistetaan funktion toiminta, funktio ei voi muuttaa argumentin arvoa, vaan tuottaa uuden arvon tai funktion. - Funktionaalisella ohjelmalla ei ole tilaa, tämä tarkoittaa sitä, että funktiolla ei ole muuttujia, joita voitaisiin muuttaa sijoituslauseilla tai toistorakenteilla. Sijoituslauseita tai toistorakenteita ei tarvita. Tästä seuraa, että funktioilla ei ole sivuvaikutuksia. - Kaikki funktionaaliset ohjelmat eivät kuitenkaan ole puhtaasti funktionaalisia, useissa kielissä tuetaan muuttujien käyttöä ja sivuvaikutuksia. - Funktionaalinen kieli on laiska, jos funktion argumentit lasketaan vasta sitten kun niitä tarvitaan. Täten vältetään turhaa laskentaa ja tehokkuus paranee. Voidaan käyttää äärettömiä tietorakenteita, jossa ohjelma käy läpi vain äärellisen määrän alkioita. Tietorakenteet kuvataan taulukoiden tai listojen avulla, listat ja taulukot voivat sisältää alkioinaan listoja tai taulukoita.
8 Funktionaalisen ohjelmoinnin hyödyt ja haitat - Funktionaaliset ohjelmat käyttäytyvät aina samalla tavalla, ei yllättäviä sivuvaikutuksia ohjelman suorituksen aikana. Funktioita helppo käyttää uudelleen sivuvaikutusten puuttuessa. Ohjelmia helppo laajentaa, koska osat eivät vaikuta toisiinsa. Funktioiden testaaminen on helppoa, koska funktio käyttäytyy samoilla argumenteilla aina samalla tavalla. - Korkea abstraktiotaso, tarvitaan vähemmän koodia, josta seuraa, että ohjelmat sisältävät vähemmän virheitä. Kirjoitustyyli on lähellä ongelman määrittelyä. - Funktionaalisissa kielissä on automaattinen roskienkeruu, eli muistin varaaminen ja vapauttaminen tehdään automaattisesti.
9 - Rinnakkaisessa ohjelmoinnissa ohjelmien kehittäminen on helpompaa, tiedon eheys säilyy, koska ei ole vaaraa, että funktiot lukitsisivat yhteisiä muuttujia tai kirjoittaisivat samaan muuttujaan yhtä aikaa. - Funktionaaliset ohjelmat sopivat hyvin matemaattisten ongelmien ratkaisemiseen, annettuun syötteeseen kohdistetaan jokin muunnos, joka voi olla monivaiheinen ja lopuksi ilmoitetaan muunnoksen tuottama tulos. - Funktionaalinen ohjelmointi sopii sellaiseen tilanteeseen, jossa muunnettavalla informaatiolla on lista- tai puurakenne, esimerkiksi xml-dokumenttien käsittely. - Ohjelmointikielen kääntäminen, jossa mm. selausvaiheessa luetaan lähdetiedostoa ja muunnetaan tiedot alkiojonoksi, jäsennysvaiheessa muunnetaan alkiojono vastaavaksi kieliopin mukaiseksi jäsennyspuuksi,..., lopuksi koodin generointivaiheessa käydään läpi jäsennyspuu ja tulostetaan sitä vastaava konekielinen koodi tulostiedostoon.
10 - Imperatiivisesta ohjelmoinnista funktionaaliseen ohjelmointiin siirtyminen saattaa olla vaikeaa, koska ajatusmaailmat poikkeavat toisistaan, ei ole muuttujia eikä toistorakenteita. - Syöttö ja tulostusoperaatioiden hoitaminen, joudutaan rikkomaan sivuvaikutuksettomuutta. Yleensä sivuvaikutuksia sisältävät osiot erotetaan tarkasti puhtaasti funktionaalisista osista. Haskelll -kielen monadi, joka on abstrakti tietotyyppi, joka kuvaa ohjelman suoritusta annetussa kontekstissa. ( - Huonosti toteutettu funktionaalinen ohjelma voi olla hidas ja muistia haaskaava. - Funktionaalinen ohjelmointi ei sovellu kovin hyvin tilanteisiin, joissa tarvitaan jokin vaikutus, esim. ikkunakäyttöliittymä joissa keskeisenä on jokin tila, jota luetaan ja päivitetään monessa kohtaa ohjelmaa - tila toimii informaationvälityskanavana ohjelman osien välillä, esim. jonkin tietokannan ympärille rakennettu ohjelma joissa seurataan suoritusajan ja muistin kulutusta, esim. laiteläheinen ohjelmointi
11 - Haasteena on suunnitella sellaiset rajapinnat, joilla ohjelma voidaan jakaa funktionaaliseen ja ei-funktionaaliseen osaan ja miten osien kommunikointi hoidetaan. (C-ohjelmiin voi liittää Haskel-koodia, Java-kielen funktionaaliset ominaisuudet). Haskell-kieli - Julkaistu Nimetty Haskell Brooks Curryn mukaan
12 Ominaisuudet - Täysin funktionaalinen kieli, suoritus on sievennystä, "tila"-käsitettä ei ole - Käännettävä kieli, käännösaikainen tyypitys, tyyppipäättely - Laiska laskenta, mitään ei tehdä ennen kuin tulosta tarvitaan, lausekkeet evaluoidaan vasta tarvittaessa. - parametreja sievennetään vain sen verran, että nähdään soveltuuko tämä sääntö - sievennyksen tulokset muistetaan, jotta sievennystä ei tarvitse tehdä uudelleen - "Arvojen" voidaan kuvitella olevan parametrittomia funktioita, jota tarvittaessa suoritetaan. - Muuttuja sisältää aina viitteen funktioon, joka laskee muuttujan arvon. - Laiska laskenta mahdollistaa äärettömät tietorakenteet, esim. lista voidaan määritellä [1..] - Ei ole sijoituslausetta, nimentö (nimi on lyhennysmerkintä arvolle): nimi = arvo
13 Tietotyypit - Vahva tyypitys ja staattinen tyypitys, funktioilla ja lausekkeilla on tyyppi. - Tyyppi tiedetään jo käännösaikana, tyypinmuunnokset tehtävä eksplisiittisesti, ei automaattista tyypinmuunnosta. - Tyyppien automaattinen päättely. - Haskell -kielessä ei aina tarvitse määritellä funktion tai ilmaisun (lausekkeen) tyyppiä. - Kieleen on rakennettu mekanismi, jonka avulla voidaan automaattisesti päätellä funktion tyyppi (signature) (joka ei kuitenkaan aina toimi oikein).
14 - Jos on määritelty funktio, ghci osaa päätellä (ainakin useimmiten) funktion tyypin esimerkiksi: isdigit a = elem a ['0'..'9'] *Main> :t isdigit isdigit :: Char -> Bool *Main> :t head head :: [a] -> a *Main> :t (++) (++) :: [a] -> [a] -> [a] - a on tyyppimuuttuja (type variable), joka voidaan korvata millä tahansa tyypillä - Funktion tyypit oikealta, ensimmäinen on palautuksen tyyppi ja loput ovat argumenttien tyyppejä.
15 Perustietoyypit - Int on prosessorikohtainen ja Integer voi käsitellä mielivaltaisen mittaisia kokonaislukuarvoja - Float ja Double ovat liukuluja joiden koko on normaalitarkkuus ja kaksoistarkkuus - Huomaa, String ja [char] ovat identtisiä
16 Tyyppiluokat (typeclasses) *Main> :t summa summa :: Num a => a -> a -> a - Num on typpiluokka ja a on jokin tietotyyppi, 'Num a =>' on tyyppirajoite (class constraint), joka ilmaisee että tyyppi a on Num -tyyppiluokan jäsen. - Num -tyyppiluokkaan kuuluva tyyppi implementoi tyyppiluokassa määritellyn käyttäytymisen, tyyppiluokka on suunnilleen sama kuin Java-kielen interface. - Eq -luokan jäsenet toteuttavat operaatiot == ja /= - Ord -luokan jäsenet, jotka ovat myös Eq -luokan jäseniä, toteuttavat operaatiot >, >=, < ja <= - Show ja Read - esittävät arvot Stringeinä ja palauttavat arvot Stringeistä - Enum, luokan jäsenet on järjestetty perättäisesti, arvot voidaan luetella
17 - Num, tyypit joiden jäsenet käyttäytyvät kuten luvut - Integral, Floating, Num - ovat tyyppejä, joilla on integer- ja floating- arvot.
18 Tyyppien määrittelyt - Funktion tyyppi voidaan määritellä eksplisiittisesti ennen funktion esittelyä summa3 a b c = a + b + c *Main> summa summa3i :: Int -> Int -> Int -> Int summa3i a b c = a + b + c *Main> summa3i <interactive>:9:9: No instance for (Fractional Int) arising from the literal 4.3 In the first argument of summa3i, namely 4.3 In the expression: summa3i In an equation for it : it = summa3i Arvon tyyppi voidaan ilmaista
19 *Main> 5::Float 5.0 Joissakin tilanteissa tyyppi on pakko ilmaista *Main> read "2" Mutta *Main> read "2" *Main> read "2" *** Exception: Prelude.read: no parse Ei toimi *Main> read "2"::Int 2
20 Sivuvaikutukset Perus I/O - Tulostaminen yms. IO on sivuvaikutus ja vaatii tarkan suoritusjärjestyksen, tämä on ristiriidassa funktionaalisuuden kanssa. Haskell-kielessä ongelma on ratkaistu ns. Monadeilla - Monadin perusidea on: syötettä voi lukea ja tulostaa vain tietyssä osassa ohjelmaa. IO:ta tekeville funktioille oma "kategoria", IO-funktiot ketjutetaan näkymättömällä parametrilla: pakko suorittaa peräkkäin. - Jokainen IO -funktio palauttaa arvon. getchar : : IO Char - IO Char ilmaisee: kun getchar käynnistetään se suorittaa toiminnan, joka palauttaa merkin. - Toiminnot, jotka palauttavat ei kiinnostavia arvoja, käyttävät tyyppiä ( ).
21 - Esimerkiksi putchar -funktio: putchar :: Char -> IO ( ) - Funktio ottaa parametrina merkin ja ei palauta mitään hyödyllistä, vastaa esimerkiksi c- kielen void -tyyppiä. - Toiminnot on jaksotettu käyttämällä >>= -operaattoria, joskin tätä operaattoria ei käytetä suoraan, vaan käytetään "syntaktista sokeria" do -notaatiota piilottamaan em. operaattorin käyttö. - Avainsana do esittelee jonon ilmaisuja, jotka suoritetaan peräkkäisessä järjestyksessä. Ilmaisu voi olla toiminto tai hahmo, joka on sidottu <- operaattoria käyttävän toiminnan tulokseen. Tai joukkoon let:iä käyttäviä paikallisia määrittelyjä. - do -notaatiossa voidaan käyttää layouttia samalla tavalla kuin let tai where, joten sulut ja puolipisteet voidaan korvata sisennyksellä. do -notaatio "liimaa" useita I/O -toimintoja yhteen. main :: IO () main = do c <- getchar putchar c
22 - nimen main käyttö on tärkeä: main on main-ohjelman aloituskohta, kuten vaikka c-kielen main. main -tyypin tulee olla IO ( ). Nimeä main käytetään erityistarkoituksessa vain modulissa Main. - Ohjelma suorittaa kaksi toimintoa peräkkäisesti, ensin se lukee yhden merkin sitoen sen 'muuttujaan' c ja sitten tulostaa merkin. Toisin kuin let -määrittelyllä esitellyt muuttujat, jotka ovat näkyvät kaikille, on <- määrittelyllä määritelty muuttuja näkyvissä vain seuraavissa lausekkeissa. - Esim. halutaan lukea merkki ja tutkia onko luettu merkki 'y' ready :: IO Bool ready = do c <- getchar c == 'y' - c <- getchar voidaan tulkita: suorita I/O -toiminto getchar ja sido sen tulos nimeen c,
23 - Yllä esitetty ei toimi, koska c == 'y' on pelkkä boolen arvo, ei tapahtuma. Boolen arvolle on rakennettava toiminto, joka palauttaa boolen arvon tuloksena, funktio return tekee sen. return -funktion tyyppi on: return :: a -> IO a - return -funktio toteuttaa joukon perättäisiä alkeistoimintoja. Sen toiminta ei ole sama kuin imperatiivissa kielissä. Korjattu versio: ready :: IO Bool ready = do c <- getchar return (c == 'y')
24 - Seuraavassa monimutkaisempi I/O-funktio (käyttää rekursiota): getline :: IO String getline = do c <- getchar if c == '\n' then return "" else do l <- getline return (c:l) - else haaran do esittelee yksittäisen lausekejonon, if -rakenteen takia on käytettävä uutta donotaatiota aloittamaan uutta toimintajonoa, jotta voitaan tehdä uusi IO -toiminto. ( - return -funktio sallii tavanomaisten arvojen, kuten boolen arvojen, siirtämisen IO - toiminnolle. - Mutta esimerkisi funkio: f : : Int -> Int -> Int ei voi suorittaa mitään IO-toimintoja, koska IO ei ole paluutyypin arvona. Tämä tarkoittaa että ohjelmia ei voi kovin helposti debugata laittamalla sekaan tulostusoperaatioita.
25 - Onko seuraava toiminto validi? nimitag = "Terve, nimeni on " ++ getline - Ei, koska ++ operaattori odottaa, että molempien parametrien tulee olla samaa tyyppiä olevia listoja. "Terve, nimeni on " on tyyppiä String ( [Char] ) ja getline on tyyppiä IO String, merkkijonoa ja I/O -toimintoa ei voi yhdistää. Merkkijono on saatava ulos I/O -operaatiosta, tämä hoituu <- getline - toiminolla. - do -lohkon viimeistä toimintoa ei voi liittää nimeen, esim main = do foo <- putstrln "Hei kerro nimesi > " -- Ok nimi <- getline faa <- putstrlln ("Terve " ++ nimi ++ ", olet fiksu tyyppi!") -- Ei toimi - do -lohko automaattisesti poimii viimeisen toimen arvon ja liittää sen tulokseensa.
26 - I/O -toimintoja voidaan suorittaa vain silloin, kun ne ovat nimetty main:issa tai toimet ovat jonkin suuremman I/O -toiminnan sisällä, joka on koottu käyttäen do -lohkoa. - do -lohkoa voidaan käyttää liimaamaan yhteen I/O -toimintoja ja sitten näitä voi käyttää toisessa do -lohkossa jne. Joka tapauksessa näitä voidaan suorittaa vai jos ne ovat main:issa.
27 Rekursio Toisto ilmaistaan rekursiolla Määritellään funktio viittaamalla määriteltävään funktioon listasumma [] = 0 listasumma (x:xs) = x + listasumma xs *Main> listasumma [] 0 *Main> listasumma [1,2,3,4,5,6] 21 - Listan elementtien summa on 0, jos lista on tyhjä - 1. elementti plus listan loppuosan elementtien summa
28 Rekursiivisen funktion määritteleminen - Etsi reunaehto, esimerkiksi lista on tyhjä, nolla tai 1 yksi... - Kehitä yleisen tapauksen kaava, kaavan oikean puolen täytyy kuvata yksinkertaisempaa ongelmaa kuin vasemman puolen. - Rekursioyhtälö annetaan yleensä kaksiosaisena: toinen osa määrittelee funktion arvon jollain tunnetulla alkuarvolla (alkuarvoja voi olla myös useita) ja toinen osa muulloin. Esimerkki, Quicksort -algoritmi srt [] = [] srt (x:xs) = srt [y y <- xs, y < x] ++ [x] ++ srt [y y <- xs, y >= x] *Main> srt [1,5,3,6,7,9,0] [1,0]3[5,6,7,9] 0[1]3[5]6[7,9] [9]
29 [0,1,3,5,6,7,9]
30 Tietorakenteet 1. Lista - Listat ja niiden käsittely on olennainen osa funktionaalista ohjelmointitapaa. Listojen käsittelyyn ja muodostamiseen on uhrattu paljon huomiota, jotta niiden käsittely olisi helppoa ja vaivatonta. [1,2,3] [1..3] -- [1,2,3] [1, 3..10] -- [1, 3, 5, 7, 9] - Merkkijonot: ['T','e','r','v',e'] ---> "Terve" - Lisäys alkuun: 0:[1,2,3] ---> [0,1,2,3] - Yhdistely: [0,1] ++ [2,3,4] ---> [0,1,2,3,4] - : "Terve" ++ " Ilkka" ---> "Terve Ilkka" - Laiskuus: lista = kaksi funktiota, toinen laskee listan 1. alkion, toinen loppulistan
31 - Listakehitelmät (list comprehensions), voidaan määritellä listoja [ runko määreet ] [ n * n n <- [1..20] ] [1,4,9,16,25,36,49,64,81,100,121,144,169,196,225, 256,289,324,361,400] - Äärettömät listat, laiska evaluointi mahdollistaa päättymättömät listarakenteet, koska arvoja evaluoidaan vasta sitten, kun arvoja tarvitaan. parilliset = [2, 4..] parineliot = [ n * n n <- parilliset ] member parineliot 64 -> True
32 2. Tupla - Tupla on kiinteän kokoinen arvojen joukko, jossa kukin arvo voi olla eri tyyppiä, toisin kuin lista. Lista voi minkä mittainen tahansa, mutta sen kaikkien elementtien on oltava samaa tyyppiä. (2016, "Ohjelmiston rakentaminen") - Tuplan erikoistapaus on ( ), joka sisältää nolla elementtiä. Tällä tyypillä on vain yksi arvo, joka kirjoitetaan myös ( ), on suunnilleen sama kuin c-kielen void.
33 Funktiot Funktion määrittely: plus x y = x + y Funktion kutsuminen plus (plus 3 4) 5 Funktion paloittainen määrittely kertoma 0 = 1 kertoma n = n * kertoma (n-1) Parametrien sovitus: tulo [ ] =1 tulo (eka:loput) = eka * tulo loput kertoma2 n = tulo [1..n]
34 - Laiskuuden vaikutuksia: päättymätön laskenta saattaa paljastaa laiskuuden (estää rinnakkaista laskentaa) Rekursiivinen muuttujan määrittely luvut = 0:[a+1 a <- luvut] 0:0+1 fibo = 1:1:[a+b (a,b) <- zip fibo (tail fibo)] - - zip yhdistää kahden listan elementit pareiksi, tail palauttaa listan lopun 1:1:1+1 1:1:2:1+2 1:1:2:3:2+3 1:1:2:3:5:3+5 1:1:2:3:5:8:5+8 1:1:2:3:5:8:13:
35 Joitakin funktioita - map-funktio: listafunktio, funktiota sovelletaan listan alkioihin - fold-funktio: listafunktio, funktiota sovelletaan listan alkioihin, tulos on kumulatiivinen - konstruktio: funktiolista, funktiolistan jokaista funktiota sovelletaan parametriin - closure: funktion ja sen käytössä olevien muuttujien yhdistelmä - currying: funktioiden variointi siten, että parametrien määrä pienenee Map - map-funktio saa argumentteina funktion ja listan, ja se käyttää argumenttina saamaansa funktiota jokaiseen listan alkioon. map -funktion palauttama arvo on lista argumenttina saadun funktion tuottamista arvoista. map -funktio on toteutettu seuraavanlaisesti: map _ [ ] = [ ] map f (x:xs) = f x : map f xs - Funktiossa käytetään hahmonsovitusta lista-argumenttiin, jos map -funktion kutsussa toisena argumenttina on tyhjä lista, palauttaa funktio tyhjän listan. _ merkintää käytetään kun argumenttia ei tarvita
36 - Jos toisena argumenttina on ainakin yhden alkion sisältävä lista suoritetaan määritelmän toinen rivi ja 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. Anonyymi funktio määritellään kirjoittamalla \ funktion eteen.
37 Prelude> map (\x -> x^2) [1..20] [1,4,9,16,25,36,49,64,81,100,121,144,169,196,225, 256,289,324,361,400] lisaayksi (xs) = map (\x->x+1) xs *Main> lisaayksi [1,2,3,4] [2,3,4,5] Prelude> import Data.Char Prelude Data.Char> map toupper "Hei maailma!" "HEI MAAILMA!"
38 foldr, foldl - fold -operaatioita voidaan käyttää toteuttamaan funktioita, joita käytetään listojen läpikäyntiin elementti elementillä, ja funktio palauttaa jotakin edelliselle perustuen - foldl(h, a, l) lista l käydään läpi alusta loppuun, "laskurille" a annetaan alkuarvo, jokaisen alkion z kohdalla päivitetään sen seuraavaksi arvoksi h(a, z) ja lopuksi palautetaan kertynyt lopullinen arvo summa xs = foldl (\acc x -> acc + x) 0 xs summa [3,5,1] 9 -Akkuun acc menee alkuarvoksi 0, funktiota \acc x -> acc + x sovelletaan listan 1. alkioon lukuun 3 (jota x esittää) ja acc saa arvon 0+3. Seuraavaksi x:n arvoksi tulee listan 2. alkio luku 5 ja acc saa arvon jne. -Funktio: summa foldl (+) 0 tekee saman, koska (+) on sama kuin \acc x -> acc + x
39 - foldr esimerkki: map' :: (a -> b) -> [a] -> [b] map' f xs = foldr (\x acc -> f x : acc) [] xs map' (+3) [2,4,6] [5,7,9] - Otetaan viimeisin elementti 6 ja sovelletaan siihen funktiota (+3) saadaan tulos 9, joka liitetään akkuun acc, jonka alkuarvo oli [ ] (tyhjä lista) 9:[ ] -> [9], joka akun uusi arvo, seuraavaksi sovelletaan funktiota (+3) arvoon 4 ja saadaan arvo 7, joka liitetään akkuun 7: [9] -> [7, 9] ja lopuksi sovelletaan funktiota (+3) arvoon 2 ja saadaan arvo 5, joka liitetään akkuun 5:[7, 9] -> [5, 7, 9], joka on lopputulos.
40 Korkeamman asteen funktiot - Kutsutaan myös funktionaalisiksi muodoiksi - Voivat ottaa parametreikseen funktioita - Myös paluuarvo voi olla funktio
41 Funktioiden yhdistäminen f(x) = x2 ja g(x) = 2x +1 h(x) = f o g(x) = f (g(x)) = f(2x + 1) = (2x+1) 2 = 4x 2 + 4x +1
42 Konstruktio - Sovelletaan funktiolistan jokaista funktiota yhteen argumenttiin, jolloin saadaan arvojen lista, jossa on yhtä monta alkiota kuin listassa oli funktioita. f(x) = 3x-1 ja g(x) = x2 + 2 (f,g) [3] tuottaa listan [8, 83] - Sovella kaikkiin, jossa samaa funktiota sovelletaan kaikkiin listan alkioihin - Merkitään symbolilla α f(x) = x/3,jolloin α(f, [1,2,3]) saadaan tulokseksi [1/3, 2/3, 1]
43 Polymorfismi - Funktiolla last poimitaan listan viimeisin alkio last [1,2,3,4,5] 5 last "Ilkka" 'a' last ["ilkka", "tapio", "rasanen"] "rasanen" last (last ["ilkka", "tapio", "rasanen"]) 'n'
44 - last toimii samalla tavalla oli listan alkioiden tyyppi mikä tahansa. :type last last :: [a] -> a - a on tyyppimuuttuja, joka on jokin tyyppi. Eli voidaan lukea, että last ottaa vastaan listan, jonka kaikki alkiot ovat jotain tyyppiä a ja palauttaa arvon, joka on samaa tyyppiä a. - Kun funktiolla on tyyppimuuttujia allekirjoituksessaan (signature), ilmaisten, että jotkut sen argumenteista voi olla mitä hyvänsä tyyppiä, kutsutaan funktiota polymorfiseksi. Tätä kutsutaan myös parametriseksi polymorfismiksi. - Koodi ei välitä mikä todellinen typpi tulee olemaan, ei edes ole mitään mekanismia jolla voitaisiin selvittää mikä todellinen tyyppi on. Tyyppi on suunnilleen sama kuin Javan generics tyyppi.
45 Closure (sulkeuma) 1 - Sulkeuma on tietorakenne, joka tallettaa funktion ja sen ympäristön. Käyttää vapaita muuttujia määrittelyssään. mkadder :: Int -> (Int -> Int) mkadder y = \x -> x + y - Funktio ottaa Int -tyyppisen argumentin ja palauttaa funktion: (Int -> Int). Palautettava funktio \x -> x + y sisältää muuttujan y, joka viittaa omaan ympäristöönsä. Kun mkadder -funktiota kutsutaan vaikka arvolla, palautuu sulkeuma, joka sisältää funktion \x -> x + y yhdessä ympäristönsä kanssa. mkadder let mul v = (\d -> map (* v) d) mul 2 [3, 2, 8, -2] [6,4,16,-4] 1 Sulkeuma on funktion ja sen käyttämien (ei-paikallisten) muuttujien viitetaulun yhdistelmä (wikipedia)
46 Currying mul 5 [1, -1, 0, 2, 3] [5,-5,0,10,15] Kaikilla funktioilla on todellisuudessa vain yksi parametri: Currying muuttaa usean parametrin funktion yhden parametrin funktioksi, joka palauttaa yhden parametrin funktion, joka palauttaa yhden parametrin funktion,, kunnes palautetaan tulos. Currying on automatiikkaa Haskel-kielessä summa x y = x + y :t summa -> summa :: Num a => a -> a -> a - Summa ottaa parametrin x ja palauttaa toisen funktion, joka ottaa parametrin y ja laskee lopputuloksen - Arvot voidaan kuvitella parametrittomiksi funktioiksi - Mahdollistaa, että vain osan parametreista annetaan summa x y = x + y
47 summa3 = summa 3 :t summa3 -> summa3 :: Integer -> Integer summa3 8 -> 11 map summa3 [2,4,6] -> [5,7,9] f n = (\m -> n - m) g = f 10 g 8 -> 2 g 4 -> 6 Pattern matching (hahmontunnistus) Funktiot voidaan määritellä hahmontunnistuksella kertoma 0 = 1 kertoma n = n * kertoma (n-1) *Main> kertoma 0 1 *Main> kertoma 1
48 1 *Main> kertoma 5 120
49 Hahmontunnistus toimii myös listoilla listanpituus [ ] = 0 listanpituus (_:xs) = 1 + listanpituus xs Alaviiva _ tarkoittaa, että ei tarvitse välittää tästä *Main> listanpituus [] 0 *Main> listanpituus ['a','c','d','d'] 4
50 Vartijat (guards) ja where bmi :: (RealFloat a) => a -> a -> String bmi paino pituus bmi <= laihis = "alipaino" bmi <= normaali = "normaali" bmi <= lihis = "ylipaino" otherwise = "vakava ylipaino" where bmi = paino / pituus ^ 2 laihis = 18.5 normaali = 25.0 lihis = merkillä alkavat rivit kuvaavat ehtoja ja = -merkin oikealla puolella ovat vertailun tulokset. Ehtoja evaluoidaan ylhäältä alaspäin ja otherwise hoitaa muuta tapaukset, kuten c-kielessä default. where - osiossa esitettyjä nimiä voidaan käyttää vain funktion sisällä, ne eivät näy muualle. Huomaa, että sisennyksellä on merkitystä!
51 Lähteet: 1. Häkkinen Tuomo 2. Heinonen Matti
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
Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005
Tyyppejä ja vähän muutakin TIEA341 Funktio ohjelmointi 1 Syksy 2005 Viime luennolla... Haskellin alkeita pääasiassa Hello World!... ja muita tutunoloisia ohjelmia Haskellilla Haskellin voima on kuitenkin
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
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/
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/
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...
TIEA341 Funktio-ohjelmointi 1, kevät 2008
TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 4 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 17. tammikuuta 2008 Modulin viimeistelyä module Shape ( Shape ( Rectangle, E l l i p
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
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
5.5 Jäsenninkombinaattoreista
5.5. JÄSENNINKOMBINAATTOREISTA 67 type Env α = FiniteMap String α data EnvT m α = MkE (Env Integer m (Env Integer, α)) instance Transformer EnvT where promote mp = MkE $ λenv mp λr return $(env, r) instance
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
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
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ä.
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
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,
Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005
Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005 Esimerkki: Laskin Liukulukulaskentaa Yhteen, vähennys, kerto ja jakolaskut Syötteenä laskutehtävä, tulosteena tulos tai virheilmoitus
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,
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
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
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
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
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:
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
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
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
TIEA341 Funktio-ohjelmointi 1, kevät 2008
TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 3 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 14. tammikuuta 2008 Viittausten läpinäkyvyyden 1 periaatteet 1. Lausekkeen arvo ei riipu
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
Funktionimien kuormitus. TIES341 Funktio ohjelmointi 2 Kevät 2006
Funktionimien kuormitus TIES341 Funktio ohjelmointi 2 Kevät 2006 Kertausta ongelma Mikä on (+) operaattorin tyyppi? Num a => a -> a -> a Mikä on (==) operaattorin tyyppi? Eq a => a -> a -> a Mikä on show
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................................
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
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
TIEA341 Funktio-ohjelmointi 1, kevät 2008
TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 11 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 Listakomprehensio Uusi tapa luoda (ja muokata) listoja: [ lauseke
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
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
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,
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
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
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
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
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ä:
Tietueet. Tietueiden määrittely
Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään
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
Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.
2. Ohjausrakenteet Ohjausrakenteiden avulla ohjataan ohjelman suoritusta. peräkkäisyys valinta toisto Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 20.1.2010 T-106.1208 Ohjelmoinnin perusteet Y 20.1.2010 1 / 40 Arvon pyytäminen käyttäjältä Käyttäjän antaman arvon voi lukea raw_input-käskyllä. Käskyn sulkujen
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:
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
Algoritmit 1. Luento 1 Ti Timo Männikkö
Algoritmit 1 Luento 1 Ti 10.1.2017 Timo Männikkö Luento 1 Algoritmi Algoritmin toteutus Ongelman ratkaiseminen Algoritmin tehokkuus Algoritmin suoritusaika Algoritmin analysointi Algoritmit 1 Kevät 2017
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ä
Mathematica Sekalaista asiaa
Mathematica Sekalaista asiaa Asetusoperaattorit Mathematicassa voi käyttää omia muuttujasymboleja melko rajattomasti ja niiden nimeämisessä voi käyttää miltei mitä tahansa merkkejä. Käytännössä nimeämisessä
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
2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)
2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka 1 Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi
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
TIEA341 Funktio-ohjelmointi 1, kevät 2008
TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 5 Ympärysmitta. Puut. Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 CASE: YMPÄRYSMITTA Lasketaan kuvioiden ympärysmittoja
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ä
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ää 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
Ohjelmointiharjoituksia Arduino-ympäristössä
Ohjelmointiharjoituksia Arduino-ympäristössä Yleistä Arduino-sovelluksen rakenne Syntaksi ja käytännöt Esimerkki ohjelman rakenteesta Muuttujat ja tietotyypit Tietotyypit Esimerkkejä tietotyypeistä Ehtolauseet
TIEA341 Funktio-ohjelmointi 1, kevät 2008
TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 14: Monadit Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 Tyyppien tyypit eli luonteet engl. kind tyyppinimet, kuten
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.
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
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,
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
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
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
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
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
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ä
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
Funktionaalinen ohjelmointi
Funktionaalinen ohjelmointi Aiemmin on käsitelty nykyohjelmoinnin suosituimpia ohjelmointiparadigmoja: imperatiivista ohjelmointia ja olio-ohjelmointia. Tässä osassa perehdytään funktionaaliseen ohjelmointiin
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
Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)
Alkuarvot ja tyyppimuunnokset (1/5) Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int luku = 123; Alkuarvon on oltava muuttujan tietotyypin mukainen, esimerkiksi int-muuttujilla kokonaisluku,
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 21.1.2009 T-106.1208 Ohjelmoinnin perusteet Y 21.1.2009 1 / 32 Tyypeistä Monissa muissa ohjelmointikielissä (esim. Java ja C) muuttujat on määriteltävä ennen
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
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,
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...
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:
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ä).
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
TIEA341 Funktio-ohjelmointi 1, kevät 2008
TIEA341 Funktio-ohjelmointi 1, kevät 2008 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 10. tammikuuta 2008 Arvot... ovat laskutoimituksen lopputuloksia... ovat lausekkeita, joihin
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,
Java-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero
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
Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi
Solidity älysopimus ohjelmointi Sopimus suuntautunut ohjelmointi Merkle puu Kertausta eiliseltä Solidity on korkean tason älysopimus ohjelmointikieli Muistuttaa olio-ohjelmointia Javalla Sopimuskoodi on
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin
C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.
Taulukot C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukon muuttujilla (muistipaikoilla) on yhteinen nimi. Jokaiseen yksittäiseen
C++11 lambdat: [](){} Matti Rintala
C++11 lambdat: [](){} Matti Rintala bool(*)(int) Tarve Tarve välittää kirjastolle/funktiolle toiminnallisuutta Callback-funktiot Virhekäsittely Käyttöliittymät Geneeristen kirjastojen räätälöinti STL:n
7/20: Paketti kasassa ensimmäistä kertaa
Ohjelmointi 1 / syksy 2007 7/20: Paketti kasassa ensimmäistä kertaa Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007
Luku 4. Tietorakenteet funktio-ohjelmoinnissa. 4.1 Äärelliset kuvaukset
Luku 4 Tietorakenteet funktio-ohjelmoinnissa Koska funktio-ohjelmoinnissa ei käytetä tuhoavaa päivitystä (sijoituslausetta ja sen johdannaisia), eivät läheskään kaikki valtavirtaohjelmoinnista tutut tietorakenteet
Harjoitus 2 (viikko 45)
Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle (jorma.laurikkala@uta.fi). Muista lisätä static-määre operaatioidesi otsikoihin, jotta ohjelmasi kääntyvät. Muista noudattaa hyvän
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,
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,
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...
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:
Java-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero
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
Demo 7 ( ) Antti-Juhani Kaijanaho. 9. joulukuuta 2005
Demo 7 (14.12.2005) Antti-Juhani Kaijanaho 9. joulukuuta 2005 Liitteenä muutama esimerkki Ydin-Haskell-laskuista. Seuraavassa on enemmän kuin 12 nimellistä tehtävää; ylimääräiset ovat bonustehtäviä, joilla
811120P Diskreetit rakenteet
811120P Diskreetit rakenteet 2016-2017 ari.vesanen (at) oulu.fi 5. Rekursio ja induktio Rekursio tarkoittaa jonkin asian määrittelyä itseensä viittaamalla Tietojenkäsittelyssä algoritmin määrittely niin,
Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005
Jäsennys TIEA341 Funktio ohjelmointi 1 Syksy 2005 Muistutus: Laskutehtävä ja tulos data Laskutehtava = Luku Double Yhteen Laskutehtava Laskutehtava Vahennys Laskutehtava Laskutehtava Tulo Laskutehtava
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:
Sisältö. 2. Taulukot. Yleistä. Yleistä
Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä