Funktionaalinen ohjelmointi

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.

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. 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, mutta tästä on nähtävissä yhä enemmän poikkeuksia, myös Suomessa. Esimerkkinä tästä on Tiina Partasen kirjoittama Racket-ohjelmoinnin oppimateriaali. Yliopistoissa funktionaalista ohjelmointia opetetaan usein syventävällä kurssilla esimerkiksi Haskell- tai Scheme-ohjelmointikielellä. Tästä on kuitenkin poikkeuksia. Imperial College Lontoossa aloittaa ohjelmoinnin opetuksen kuuden viikon mittaisella Haskell-kurssilla, siinä missä esimerkiksi Suomessa Haskell-kieltä opiskellaan yleensä vasta toisena tai kolmantena opiskeluvuonna tai syventävissä opinnoissa.  
Koska suomenkielistä oppimateriaalia on hyvin vähän tarjolla, ovat jotkin yksityishenkilöt päätyneet tarjoamaan ilmaista oppimateriaalia Haskell-kielen ideoiden opiskeluun. Haskell-kielen oppiminen tukee hyvin minkä tahansa funktionaalisen tai funktionaalisia piirteitä sisältävän ohjelmointikielen oppimista. Tästä on esimerkkinä Juuso Vuorisen kirjoittama teos Kanaherkun tuoksuinen johdatus funktionaaliseen ohjelmointiin. Teos korostaa tiedon käsittelyn näkökulmaa ja siinä tutkitaan jo moniin muihinkin ohjelmointikieliin tiensä löytäneet funktionaalista ohjelmointiparadigmaa edustavat funktiot map, filter ja fold (reduce). Edellä mainitut funktiot ovat käytössä myös lukuisissa ei-funktionaalisissa kielissä, joten niiden oppimisesta on hyötyä monen eri ohjelmointikielen ymmärtämisessä.   
On myös huomattu, että funktionaalinen ohjelmointi tukee matematiikan oppimista - esimerkkinä algebran ja funktionaalisen ohjelmoinnin välillä havaittu positiivinen siirtovaikutus. Ohjelmointiajattelua väitöskirjassaan ruotinut TkT Pia Niemelä totetaa, että "erityisesti funktionaaliset kielet tuottavat vastavuoroisia hyötyjä matematiikan opetuksen kanssa".