Laitetaanpas pystyyn ketju funktionaaliselle ohjelmoinnille yleisesti kielestä riippumatta. Funktionaalisella tyylillähän voi periaatteessa ohjelmoida miltei millä kielellä tahansa, mutta minua on jo pitkään kiehtonut Haskell, joka on puhtaasti funktionaalinen kieli.
JavaScriptillä olen käyttänyt Underscore.js -kirjastoa. Niitä on paljon muitakin, mutten ole niistä niin perillä.
Joitain funktionaalisen ohjelmoinnin erityispiirteitä
Tässä käytin Haskell-esimerkkejä, mutta kuten sanottua, funktionaalista tyyliä voi soveltaa myös muissa ohjelmointikielissä. Ainakin minulle on tavaksi tullut välttää sivuvaikutuksia aina kun mahdollista. Näin koodista tulee selkeämpää, yksinkertaisempaa ja sitä kautta myös turvallisempaa. Virheet on myös helpompi löytää ja testattavuus on helpompaa kun funktioilla ei ole sivuvaikutuksia.
JavaScriptillä olen käyttänyt Underscore.js -kirjastoa. Niitä on paljon muitakin, mutten ole niistä niin perillä.
Joitain funktionaalisen ohjelmoinnin erityispiirteitä
- Muuttumattomuus, "muuttujat" ovat muuttumattomia, eivätkä näin ollen muutu.
- Funktioilla ei ole sivuvaikutuksia, eli funktio tuottaa ajasta ja paikasta riippumattomasti aina saman arvon kutsuttaessa sitä samoilla parametrien arvoilla. Funktiot eivät siis riipu ulkomaailmasta vaan ovat puhtaita. Esimerkiksi tällaisia tilanteita tulisi välttää (python-esimerkki):
Koodi:
# Funktion arvo riippuu ulkopuolisesta muuttujasta x
x = 4
def funktio(y):
return x + y
- Funktiot ovat ensimmäisen luokan kansalaisia, eli funktiot voivat palauttaa funktioita ja ottaa parametreinaan vastaan funktioita. Hyvänä esimerkkinä map-funktio.
Koodi:
-- lista, joka käsittää luvut 1-20
lista :: [Int]
lista = [1..20]
{-
uusi lista, joka muodostetaan antamalla map-funktiolle funktio,
(tässä tapauksessa anonyymi sellainen), jota sovelletaan listan
jokaiseen elementtiin
-}
uusi_lista :: [Int]
uusi_lista = map (\x -> x * 2) lista
- Laiska suoritus, lasketaan vain se mitä tarvitaan, silloin kun sitä tarvitaan. Tämä mahdollistaa äärettömät tietorakenteet.
Koodi:
-- 1:stä alkava äärettömän pitkä lista
lista :: [Int]
lista = [1..]
Tässä käytin Haskell-esimerkkejä, mutta kuten sanottua, funktionaalista tyyliä voi soveltaa myös muissa ohjelmointikielissä. Ainakin minulle on tavaksi tullut välttää sivuvaikutuksia aina kun mahdollista. Näin koodista tulee selkeämpää, yksinkertaisempaa ja sitä kautta myös turvallisempaa. Virheet on myös helpompi löytää ja testattavuus on helpompaa kun funktioilla ei ole sivuvaikutuksia.