Renhed (i forhold til et programmeringssprog) - fraværet af bivirkninger . Et programmeringssprog er rent, hvis alle funktionerne i det pågældende sprogs programmer er rene .
Programmer skrevet på rene programmeringssprog er nemmere at fejlfinde , verificere og nemmere at opdage fejl, der ikke kunne opdages ved test . Programmer i et rent programmeringssprog er nemmere at omskrive uden at introducere fejl. Samtidig er selve processen med at planlægge et program med forventning om renhed mere kompliceret.
En anden vigtig fordel ved rene funktionelle sprog er parallelisme . Da alle funktioner til beregninger kun bruger deres parametre, er det muligt at organisere beregningen af uafhængige funktioner i en vilkårlig rækkefølge eller parallelt, dette vil ikke påvirke beregningsresultatet. Parallelisme kan organiseres ikke kun på sprogkompilatorniveau, men også på hardwarearkitekturniveau. Der er eksperimentelle computere baseret på lignende arkitekturer, såsom Lisp-maskinen .
Rene funktionelle sprog kaldes nogle gange "deterministiske" i den forstand, at for enhver funktion har hvert opkald altid den samme effekt (i imperative sprog er dette generelt ikke sandt). Samtidig kaldes sådanne sprog "ikke-deterministiske" i den forstand, at rækkefølgen af den faktiske programudførelse kan variere meget afhængigt af den specifikke implementering af sproget: algoritmer kan implicit paralleliseres, mellemliggende data kan udelukkes fra konverteringskæden, repræsentationen af de samme typer kan variere selv inden for det samme program osv. (dette er simpelthen umuligt for imperative sprog). Kort sagt, rene sprog er deterministiske på kildekodeniveau og ikke-deterministiske på implementeringsniveau (imperative sprog er omvendt).
Den mest seriøse anvendelse af programmeringssprog, hvor bivirkninger konstant er til stede i funktioner, er input-output . Det kan antages, at enhver operation af datainput fra brugeren er en handling med en bivirkning, da det er umuligt at sige på forhånd, hvad brugeren nøjagtigt vil indtaste som parameterværdier, der bruges i beregningsprocessen. Selvom nogle forskere og teoretikere hævder, at I/O ikke kan betragtes som et eksempel på tilstedeværelsen af bivirkninger, da I/O i bund og grund er en ændring i programmets miljø, men under alle omstændigheder laver I/O funktionerne bruger det ikke-deterministisk.
I ren funktionel programmering er der ingen tildelingsoperatør, objekter kan ikke ændres og ødelægges, man kan kun oprette nye ved nedbrydning og syntese af eksisterende. Skraldesamleren indbygget i enhver funktionel sprogoversætter vil tage sig af unødvendige genstande . På grund af dette, i rene funktionelle sprog, er alle funktioner fri for bivirkninger. Dette forhindrer dog ikke disse sprog i at efterligne nogle nyttige imperative funktioner, såsom undtagelseshåndtering og foranderlige (destruktivt) arrays . Der er specielle metoder til dette.
Nogle årsager til tilstedeværelsen af funktioner med bivirkninger kan dog ikke helt fjernes fra funktionelle programmeringssprog, da sådanne sprog i dette tilfælde ville være for begrænsede i praktisk brug. Først og fremmest gælder dette specifikt input-output. Det er svært at forestille sig et fuldgyldigt programmeringssprog, hvor der ikke er mulighed for at udføre datainput fra brugeren i en interaktiv tilstand, samt at udføre dataoutput for brugeren.
For at muliggøre brugen af teknologier såsom I/O uden at forringe renhedsegenskaberne, bruger mange funktionelle programmeringssprog, inklusive Haskell , en særlig mekanisme kaldet " monaden ". Monader ser ud til at indpakke de nødvendige imperative egenskaber og forhindre dem i at blive blandet med den rene syntaks af et funktionelt sprog. Brugen af monader gjorde det muligt at implementere alle de flaskehalse, der regulerede tilstedeværelsen af bivirkninger i funktioner.
Så for eksempel, for at levere I/O på Haskell-sproget, implementeres en standardmonade IO, uden for hvilken det er umuligt at udføre nogen I/O-operation. Alle andre standard monader implementeret til Haskell sproget har de samme egenskaber.