Funktionaalinen ohjelmointi Sisällysluettelo Historia | Funktionaalisen ohjelmoinnin etuja | Esimerkkejä | Funktionaalinen ohjelmointi opetuksessa | Lähteet | NavigointivalikkoKirjan verkkoversiovideoluennotJohdatus funktionaaliseen ohjelmointiin -luentokalvotStructure and Interpretation of Computer Programs – 2nd ed.Hal Abelsonin & Gerald Jay Sussmanin videoluennotWhy Functional Programming Matters

Funktionaalinen ohjelmointiTietojenkäsittelytiede


ohjelmointiparadigmafunktioidenlambdakalkyyliinrekursionimperatiivisessa ohjelmoinnissaSchemeHaskellMathematicaCommon LispiäErlangiaScalaaXMLXSLTJavaClojuresulkeumatlaskennan malliaTuringin konelambda-kalkyyliJohn McCarthyLispFortrantyypinpäättelynHei maailma -ohjelmanFibonaccin lukujaScheme[1]Kirjan verkkoversiovideoluennotHaskellScheme





Ohjelmointiparadigmat

Deklaratiivinen ohjelmointi

Epärakenteellinen ohjelmointi

Funktionaalinen ohjelmointi

Geneerinen ohjelmointi

Imperatiivinen ohjelmointi

Logiikkapohjainen ohjelmointikieli

Olio-ohjelmointi

Proseduraalinen ohjelmointi

Prototyyppipohjainen ohjelmointi

Reaktiivinen ohjelmointi

Rinnakkaisohjelmointi

Strukturoitu ohjelmointi


Funktionaalinen ohjelmointi eli funktio-ohjelmointi on ohjelmointiparadigma, joka perustuu matemaattisten funktioiden käyttöön ja tarkemmin lambdakalkyyliin. Puhtaasti funktionaalisissa ohjelmissa ei ole lainkaan tilaa eikä siten myöskään sijoituslausetta tai silmukoita: muuttujaan ei voida sijoittaa uutta arvoa, ja suuret tietomäärät käsitellään rekursion avulla. Toisin kuin imperatiivisessa ohjelmoinnissa, funktiolla ei ole sivuvaikutuksia eli sen arvo on aina sama samoilla parametreilla.


Monet funktionaaliset ohjelmointikielet eivät ole puhtaasti funktionaalisia, vaan tukevat myös tilamuuttujia ja sivuvaikutuksia. Puhtaudella on joitain ongelmallisia kohtia, kuten monimutkainen syötön ja tulostuksen toteutus, joka vastaavasti on helppo toteuttaa jos sivuvaikutukset sallitaan. Silti ohjelmointikieltä pidetään funktionaalisena, mikäli sillä pääsääntöisesti ohjelmoidaan kuten puhtaasti funktionaalisilla kielillä.


Yliopistoissa suosituimpia funktionaalisia ohjelmointikieliä ovat Scheme ja Haskell sekä symboliseen matematiikkaan Mathematica. Yritysmaailmassa käytetään enemmän Common Lispiä, Erlangia, Scalaa ja XML-tiedostojen muuntamiseen tarkoitettua XSLT:tä. Lisäksi monissa imperatiivisissa kielissä on jonkinlaista tukea funktionaaliselle ohjelmoinnille: usein ainakin funktion voi antaa parametrina, ja joskus kielessä on rakenne nimettömien funktioiden luomiseen lambda-lausekkeella. Merkittävänä poikkeuksena Java ei tue suoraan oikeastaan mitään funktionaalisen ohjelmoinnin apuvälinettä, mutta JVM-ympäristön päälle on toteutettu funktionaalisia kieliä (kuten Clojure ja Scala), ja Javaan itseensä on suunnitelmissa lisätä tiettyjä funktionaalisia ominaisuuksia (kuten sulkeumat).




Sisällysluettelo





  • 1 Historia


  • 2 Funktionaalisen ohjelmoinnin etuja


  • 3 Esimerkkejä

    • 3.1 Fibonaccin luvut


    • 3.2 Funktion määritteleminen toisten funktioiden avulla



  • 4 Funktionaalinen ohjelmointi opetuksessa


  • 5 Lähteet




Historia |


Vuonna 1936, siis ennen tietokoneita, toisistaan erillään julkaistiin kaksi tietojenkäsittelytieteen matemaattisen pohjan muodostavaa laskennan mallia: Turingin kone ja lambda-kalkyyli. Turingin kone on tietokoneen matemaattinen malli: ohjelman suoritus etenee koneen tilaa muuttamalla. Lambda-laskenta mallintaa funktion laskentaa: sieventämällä lauseketta säännöllisesti yksinkertaisemmaksi saadaan selville funktion arvo.


Pian Turingin koneen ja lambda-laskennan huomattiin olevan sama asia eri tavalla määriteltynä: toisin sanoen Turingin koneen ja lambda-laskennan ohjelmat voidaan kääntää toisikseen. Kummatkin mallit ovat olleet hyödyllisiä: Turingin koneen pohjalta kehittyi aikanaan tietokone, mutta ohjelmointikielet perustuvat enemmän lambda-kalkyyliin. Funktionaaliset ohjelmointikielet ovat jopa hyvin lähellä alkuperäistä lambda-kalkyyliä.


Vuonna 1958 John McCarthy kehitti lambda-kalkyylin pohjalta Lisp-kielen (List Processing) tekoälyohjelmien määrittelyä varten, esimerkkinä siitä kuinka yksinkertainen Turing-täydellinen kieli voi olla. Se perustui vahvasti lambda-kalkyyliin mutta salli myös perinteisen imperatiivisen ohjelmoinnin.


Lispin ei ollut tarkoitus olla oikea ohjelmointikieli. Siitä huolimatta McCarthyn kollega Steve Russell ohjelmoi Lisp-tulkin tietokoneelle. Erilaiset Lispin muunnelmat yleistyivät nopeasti ohjelmointikäytössä. Vaikka Lisp-kieliperhe pohjautuu toiseksi vanhimpaan yleisesti käytettyyn ohjelmointikieleen, se on säilynyt yhtenä tunnetuimmista ja käytetyimmistä funktionaalisista ohjelmointikielistä. Iästään huolimatta se ei ole muuttunut merkittävästi toisenlaiseksi kuten Fortran.


70-luvun lopulla Robin Milner yhdisti tyyppiteorian ja teoreemantodistajien tutkimusta konkreettiseen funktionaaliseen ohjelmointiin. Tuloksena oli ML-ohjelmointikieli, joka esitteli automaattisen tyypinpäättelyn ja käytti matematiikalta näyttävää kielioppia. Siitä kehittyi myöhemmin Standard ML, OCaml ja Haskell, jotka ovat tunnettuja muun muassa vahvasta tyyppijärjestelmästä ja kääntäjien optimointikyvystä. Nykyisin ML-pohjaisten funktionaalisten kielten ja niiden tyyppijärjestelmien sekä optimoinnin tutkimus on hyvin vilkasta.



Funktionaalisen ohjelmoinnin etuja |


  • Selkeä yhteys matematiikkaan, jolloin ohjelma voidaan helposti kirjoittaa vastaamaan määritelmää ja todistaa oikeaksi induktiolla.

  • Parempi tuki funktioiden käsittelylle (funktio parametrina, lambda-lauseke, funktioiden kompositio, currying eli curry-muunnos tai ”kuritus”), jolloin ohjelma usein voidaan jakaa pienempiin ja yleiskäyttöisempiin osiin.

  • Koska sivuvaikutuksia ei ole, funktioiden suoritusjärjestys on vapaa ja kääntäjä voi optimoida samanlaiset funktiokutsut yhdeksi.

  • Rinnakkaisuus ei aiheuta lainkaan vaikeuksia, koska jaettavaa tilaa ei ole. Periaatteessa jokainen funktiokutsu voitaisiin suorittaa eri säikeessä.

  • Ohjelmoija oppii määrittelemään ohjelmia täsmällisesti, soveltamaan rekursiota ja käyttämään geneerisyyttä.

  • Ohjelmointikieli on monesti yksinkertaisempi suunnitella ja toteuttaa.


Esimerkkejä |


Esimerkeissä käytetään matematiikan tapaista pseudokoodia. Funktion parametreja ei kuitenkaan eroteta sulkeilla tai pilkuilla juuri missään funktionaalisessa kielessä, joten func(x) = 2x ilmaistaan seuraavasti:


func x = 2*x


Fibonaccin luvut |


Funktionaalisissa ohjelmointikielissä Hei maailma -ohjelman vastine on funktio, joka laskee Fibonaccin lukuja:


fib n = 0, kun n = 0
1, kun n = 1
fib (n−1) + fib (n−2), kun n > 1

Yllä olevasta käy heti ilmi, että fib ei ole määritelty, jos n < 0.



Funktion määritteleminen toisten funktioiden avulla |


Leikitään, että voidaan käyttää vain kahta funktiota:


plusyksi x = x + 1
miinusyksi x = x - 1

Niinpä funktio, joka lisää parametriinsa kaksi, voidaan määritellä edellisen avulla:


pluskaksi x = plusyksi (plusyksi x)

Funktio, joka lisää yhteen parametrit x ja y, onnistuu rekursion avulla:


plus x y = x, kun y = 0
plus (plusyksi x) (miinusyksi y), kun y > 0


Funktionaalinen ohjelmointi opetuksessa |


Tietojenkäsittelytieteen perusteita opetettiin funktionaalisella Scheme-kielellä noin sadassa oppilaitoksessa vuonna 2007.[1] Tällöin lähes poikkeuksetta oppikirja on kehuttu Structure and Interpretation of Computer Programs. Kirjan verkkoversio ja videoluennot ovat saatavilla verkosta.


Yleensä funktionaalisia kieliä ei käytetä perusopetuksessa. Kuitenkin yliopistoissa funktionaalista ohjelmointia opetetaan usein syventävällä kurssilla esimerkiksi Haskell- tai Scheme-ohjelmointikielellä.



Lähteet |


  • Nykänen, Matti: Johdatus funktionaaliseen ohjelmointiin -luentokalvot

  • Structure and Interpretation of Computer Programs – 2nd ed.

  • Hal Abelsonin & Gerald Jay Sussmanin videoluennot

  • Hughes, John: Why Functional Programming Matters


Popular posts from this blog

Disable / Remove link to Product Items in Cart Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?How can I limit products that can be bought / added to cart?Remove item from cartHide “Add to Cart” button if specific products are already in cart“Prettifying” the custom options in cart pageCreate link in cart sidebar to view all added items After limit reachedLink products together in checkout/cartHow to Get product from cart and add it againHide action-edit on cart page if simple productRemoving Cart items - ObserverRemove wishlist items when added to cart

Helsingin valtaus Sisällysluettelo Taustaa | Yleistä sotatoimista | Osapuolet | Taistelut Helsingin ympäristössä | Punaisten antautumissuunnitelma | Taistelujen kulku Helsingissä | Valtauksen jälkeen | Tappiot | Muistaminen | Kirjallisuutta | Lähteet | Aiheesta muualla | NavigointivalikkoTeoksen verkkoversioTeoksen verkkoversioGoogle BooksSisällissota Helsingissä päättyi tasan 95 vuotta sittenSaksalaisten ylivoima jyräsi punaisen HelsinginSuomalaiset kuvaavat sotien jälkiä kaupungeissa – katso kuvat ja tarinat tutuilta kulmiltaHelsingin valtaus 90 vuotta sittenSaksalaiset valtasivat HelsinginHyökkäys HelsinkiinHelsingin valtaus 12.–13.4. 1918Saksalaiset käyttivät ihmiskilpiä Helsingin valtauksessa 1918Teoksen verkkoversioTeoksen verkkoversioSaksalaiset hyökkäävät Etelä-SuomeenTaistelut LeppävaarassaSotilaat ja taistelutLeppävaara 1918 huhtikuussa. KapinatarinaHelsingin taistelut 1918Saksalaisten voitonparaati HelsingissäHelsingin valtausta juhlittiinSaksalaisten Helsinki vuonna 1918Helsingin taistelussa kaatuneet valkokaartilaisetHelsinkiin haudatut taisteluissa kaatuneet punaiset12.4.1918 Helsingin valtauksessa saksalaiset apujoukot vapauttavat kaupunginVapaussodan muistomerkkejä Helsingissä ja pääkaupunkiseudullaCrescendo / Vuoden 1918 Kansalaissodan uhrien muistomerkkim

Adjektiivitarina Tarinan tekeminen | Esimerkki: ennen | Esimerkki: jälkeen | Navigointivalikko