Clean (ohjelmointikieli)

Clean on puhtaasti funktionaalinen ohjelmointikieli. Kielen pääasiallinen toteutus on Nijmegenin yliopiston tekemä, ja se on saatavilla Microsoft Windows-, Apple Macintosh-, Solaris- ja Linux-käyttöjärjestelmälle. Toteutus on kaksoislisensöity – se on saatavilla sekä GNU LGPL- että kaupallisen suljetun lähdekoodin lisenssillä. Kielen kehitystyö tapahtuu pääasiassa Windows-alustalla, mikä näkyy siinä, että muille alustoille ei ole vielä saatavilla dynaamista linkkeriä. Myös I/O-kirjastojen toteutuksessa on eroja. 

Clean on hyvin samankaltainen kieli kuin Haskell. Kielten syntaksissa on pieniä eroja, minkä lisäksi Clean sisältää joukon Haskell 98 -stardardista puuttuvia ominaisuuksia. Kielen ainutlaatuisiin piirteisiin lukeutuvat uniikit tyypit, joilla jonkin arvon olemassaolo voidaan rajoittaa tarkalleen yhteen paikkaan ohjelmassa. Ominaisuutta voidaan käyttää monadien asemesta pakotetun peräkkäisyyden toteuttamiseen esimerkiksi I/O:ssa. Lisäksi ominaisuudella voidaan taata, ettei arvon muuttaminen paikallaan riko viittauksellista läpinäkyvyyttä. Cleanin laskenta perustuu graafin uudelleenkirjoittamiseen ja reduktioihin. Yhdessä nämä ominaisuudet tekevät kielen toteutuksesta erittäin tehokkaan. Kielen käännös tapahtuu kaksivaiheisesti ABC-tavukoodin kautta natiivikoodiksi.

Kieltä käytetään lähinnä akateemisessa tutkimuksessa.

Ominaisuuksia 

Kielen merkittävimmät sisäänrakennetut ja muut ominaisuudet ovat:

 Viittauksellinen läpinäkyvyys – funktiokutsu palauttaa samoilla syötteilla aina saman tuloksen
 Korkeamman asteen funktiot, hahmonsovitus, vartiolausekkeet ja currying
 Listat ja taulukot (listoille ja taulukoille on useita tarkentavia tyyppiannotaatioita)
 Algebralliset tietotyypit ja tietueet
 Geneerisyys, tyyppiluokat, uniikit ja dynaamiset tyypit
 Laiska laskenta, joka mahdollistaa äärettömät tietotyypit
 Automaattinen roskienkeräys
 Siirrettävyys eri alustoille korkean abstraktiotason ansiosta
 Graafinen kehitysympäristö, joka on kirjoitettu Cleanilla

Esimerkkejä 
Hei maailma:
 Start = "Hei maailma"

Kertoma:
 kertoma 0 = 1
 kertoma n = n * kertoma (n - 1)
 
 // tulostetaan 10:n kertoma
 Start = kertoma 10

Fibonacci-sarja:
 fib 0 = 0 
 fib 1 = 1 
 fib n = fib (n - 2) + fib (n - 1)

Potenssioperaattori:
 (^) infixr 8 :: Int Int → Int
 (^) x 0 = 1
 (^) x n = x * x ^ (n - 1)

Yllä tyyppisignatuuri määrää, että funktio on oikealta assosiatiivinen, käyttää infix-muotoa ja sen presedenssin prioriteetti on 8. Tällöin ^ sitoo voimakkaammin kuin *, jonka vuoksi x*x^(n-1) on yhtä suuri x*(x^(n-1)):n eikä (x*x)^(n-1):n kanssa. Tämä funktio on määritelty Cleanin standardiympäristössä.

Aiheesta muualla 
Clean homepage
Clean in FOLDOC 
Clean in The Computer Language Benchmarks Game

Funktionaaliset ohjelmointikielet