Movatterモバイル変換


[0]ホーム

URL:


Naar inhoud springen
Wikipediade vrije encyclopedie
Zoeken

Functioneel programmeren

Uit Wikipedia, de vrije encyclopedie

In deinformatica isfunctioneel programmeren eenprogrammeerstijl en eenprogrammeerparadigma. Hierbij wordt deinformatieverwerking in de vorm vanfuncties uitgedrukt, vergelijkbaar metwiskundigefuncties. Bij deze stijl dienen (liefst alle) wijzigingen vanvariabelen buiten de functie (de zogenaamde "neveneffecten") en het opslaan vanprogrammatoestand en wijzigbare variabelen vermeden te worden. Variabelen voor onder meer een accumulator, teller, globale of controlevariabele zijn uit den boze.
Voorbeelden van meer of minder zuivereprogrammeertalen voor functioneel programmeren zijnAPL,Erlang,F#,Haskell,Lisp,ML,Scala enScheme, waarvan Haskell de puurste is.

Een hoger concept van berekening

[bewerken |brontekst bewerken]

Imperatief programmeren

[bewerken |brontekst bewerken]

Eencomputer voert een berekening uit volgens een vastgelegd patroon van stappen; iedere stap in dit patroon is een kleine, simpele deelberekening. Het beschouwen van een berekening als een serie kleine stappen is een mogelijk model voor het uitvoeren van een berekening.

Functioneel programmeren

[bewerken |brontekst bewerken]

Een ander model – dat zich richt op een hoger niveau van denken, begrijpen en berekenen – is het model van delambdacalculus vanAlonzo Church enStephen Cole Kleene. In dit model vindt een berekening plaats door het toepassen vanfuncties op argumenten: "als ik functief{\displaystyle {\mathfrak {f}}} toepas op argumenta{\displaystyle a} krijg ik als antwoordb{\displaystyle b}". Hoe de toepassing vanf{\displaystyle {\mathfrak {f}}} opa{\displaystyle a} precies totb{\displaystyle b} leidt, doet er niet toe – het gaat erom datb{\displaystyle b} het antwoord is. In puur functionele programmeertalen kunnen functies dan ook geen zogenaamdeneveneffecten veroorzaken. Dit zijn effecten die invloed hebben op meer dan het resultaat van de functie, zoals het veranderen van een globale variabele. Het veranderen van zo'n variabele wordt een destructieve re-assignment genoemd.

Abstractie en applicatie

[bewerken |brontekst bewerken]

De twee belangrijkste mechanismen binnen delambdacalculus om tot een berekening te komen zijn de abstractie en deapplicatie.

Voor het programmeren komt abstractie neer op het definiëren van een functie: "bij iedere term A met de eigenschappen die bij A horen, hoort een antwoord B die op deze-en-deze manier afhangt van wat A precies is". Bijvoorbeeld de functie

f:RR{\displaystyle {\mathfrak {f}}:\mathbb {R} \mapsto \mathbb {R} }
f(x)=x22x+3{\displaystyle {\mathfrak {f}}(x)=x^{2}-2x+3}

Deze functief{\displaystyle {\mathfrak {f}}} definieert een verbinding tussen twee waarden uit de verzamelingR{\displaystyle \mathbb {R} }. Deze verbinding kan toegepast worden op ieder element vanR{\displaystyle \mathbb {R} } en levert dan ook weer een ander, bijbehorend element vanR{\displaystyle \mathbb {R} } op. Hoe dat gebeurt en wat eencomputer (of mens) ervoor moet doen om dat bijbehorende element te vinden doet er niet toe, het gaat erom dat de verbinding bestaat en toegepast kan worden.

Naast abstractie is er ook de applicatie. Voor programmeerdoeleinden komt dit neer op het toepassen van een functie op een argument. Bijvoorbeeld:

f(7)38{\displaystyle {\mathfrak {f}}(7)\mapsto 38}

Toepassing van een functie op een specifiek argument dat voldoet aan de algemene beschrijving van argumenten voor die functie, levert een antwoord op. Hoe en waarom doet er weer niet toe, het gaat er alleen om dat het antwoord geproduceerd wordt.

Referentiële transparantie

[bewerken |brontekst bewerken]

Veel functies in functionele programmeertalen zijnreferentieel transparant. Dit houdt in dat eenexpressie vervangen kan worden door zijn waarde zonder de werking van het programma te veranderen. Een voorbeeld hiervan zijnrekenkundige bewerkingen, zoals1 + 1; dit kan vervangen worden door2 zonder het programma te veranderen. Veel wiskundige functies zijn ook referentieel transparant, zoalssin(x) (deze levert voor een gegevenx altijd dezelfde waarde op).

Een ander, belangrijk aspect van delambdacalculus is dat functies gedefinieerd kunnen worden in termen van andere functies (tenminste, voor zover het voor het programmeren in functionele talen van belang is) – inclusief in termen van zichzelf. Dit betekent dat de lambdacalculus een enorme reikwijdte heeft wat betreft de definities die gegeven kunnen worden. Zover zelfs dat de lambdacalculus model staat voor het geheel van alle berekenbare problemen die er zijn. Functionele talen kunnen dus alles berekenen wat berekend kan worden.

Een voorbeeld van een definitie in termen van functies (specifiek, een recursieve definitie) is de volgende:

fact:NN{\displaystyle {\mathit {fact}}:\mathbb {N} \mapsto \mathbb {N} }
fact(n)={n=01n>0nfact(n1){\displaystyle {\mathit {fact}}(n)=\left\lbrace {\begin{array}{ccl}n=0&\rightarrow &1\\n>0&\rightarrow &n*{\mathit {fact}}(n-1)\end{array}}\right.}

Hogere-ordefuncties

[bewerken |brontekst bewerken]

Een belangrijk kenmerk van een functionele taal is dat een functie ook een andere functie als argument kan meekrijgen. Dit wordenhogere-ordefuncties genoemd. Zo bestaat inHaskell en andere functionele talen de functiemap. De functiemap past een andere functie F op alle elementen uit een lijst L. De argumenten van functiemap zijn dus de functie F en de lijst L.

Functioneel model naar functionele taal

[bewerken |brontekst bewerken]

Een dergelijk hoog-niveau model van berekening is natuurlijk mooi en vooral eenvoudig, maar het is niet direct toe te passen op dehardware zoals die voorkomt in modernecomputers. Functionele talen leunen dan ook sterk op geavanceerde en vooral complexecompilers eninterpreters die de vertaalslag maken van functietoepassing naar het stap-voor-stapmodel van deprocessor.

Deze vertaalslag is veel groter dan bij deimperatieve talen, wat zijn weerslag heeft gevonden in de (vaak beperkte) snelheid waarmee veel functionele programma's uitgevoerd werden (zeker in de eerste generaties van ontwikkelomgevingen voor deze talen was dit een aanzienlijk probleem). Dit heeft zijn weerslag gehad in de populariteit van functionele talen buiten de onderzoeksomgevingen vanuniversiteiten.

Tegenwoordig neemt de populariteit van functionele talen sterk toe. Zij zijn namelijk door de afwezigheid vanneveneffecten veel beter dan imperatieve talen in staat om berekeningengeparallelliseerd uit te voeren. De berekening wordt dan uitgevoerd door meerdereprocessoren van één computer tegelijkertijd of zelfs door meerdere computers tegelijkertijd. Vanaf ongeveer 2005 zijn computers met meerdere processoren sterk in prijs gedaald en is de belangstelling voor functioneel programmeren toegenomen.

Onderscheid met andere soorten programmeertalen

[bewerken |brontekst bewerken]

Het grootst merkbare onderscheid is ongetwijfeld tussen de functionele programmeertalen en deimperatieve talen. Maken functionele talen gebruik van het hoog-niveau model van delambdacalculus, de imperatieve talen zijn geheel geënt op het berekeningsmodel van de onderliggende processor: stap voor kleine stap, iedere stap letterlijk in het imperatieve programma opgenomen als een individuele opdracht. Is een functie in een functionele taal een programma op zich, in een imperatieve taal wordt iedere functie onderverdeeld in deze kleine, losse stappen. Ook een groot verschil is dat in de puur functionele talen geen sprake is van expliciete variabelendeclaratie of geheugenreservering. Dit zorgt voor transparante, compacte code. Het is mede daardoor ook makkelijk om over deze code te redeneren, en bijvoorbeeld correctheid te bewijzen. Sterker nog, omdat je precies weet wanneer er wat met een waarde gebeurt (iets wat in de imperatieve wereld zeer moeilijk bereikt kan worden door de mogelijkheid vanneveneffecten), kan je automatisch uitzoeken wanneer bepaalde functies parallel kunnen worden uitgevoerd.

Daarnaast onderscheiden de functionele talen zich van delogische talen. In deze taalcategorie draait het niet om functies en functie-toepassingen maar om bewijsobjecten enpredicatenlogica. De logische en functionele talen lijken echter veel op elkaar in het opzicht dat ze een hoog-niveau abstractie als model kiezen en staan daarin samen lijnrecht tegenover deimperatieve talen; om deze reden worden functionele enlogische talen samen ook wel dedeclaratieve paradigma genoemd.

Ten slotte is er veel onenigheid over de positie vanobjectgeoriënteerde programmeertalen in dit geheel; deze talen verdelen een berekening in verschillende onderdelen, waarbij ieder onderdeel de verantwoordelijkheid is van een opzichzelfstaand programma-object. Deze objecten op zich worden intern echter weer opgesteld aan de hand van één (of meer) van de bovengenoemde modellen, dus de vraag blijft of dit model als een geheel afzonderlijk model gezien kan worden.

Websites

[bewerken |brontekst bewerken]
IBM Functional Thinking Series
(en)Ford, Neal,Functional thinking: Thinking functionally, Part 1.IBM developerWorks(3 maart 2011).
(en)Ford, Neal,Functional thinking: Thinking functionally, Part 2.IBM developerWorks(31 mei 2011).
(en)Ford, Neal,Functional thinking: Thinking functionally, Part 3.IBM developerWorks(28 juni 2011).
(en)Ford, Neal,Functional thinking: Immutability.IBM developerWorks(27 juli 2011).
(en)Ford, Neal,Functional thinking: Coupling and composition, Part 1.IBM developerWorks(30 augustus 2011).
(en)Ford, Neal,Functional thinking: Coupling and composition, Part 2.IBM developerWorks(4 oktober 2011).
(en)Ford, Neal,Functional thinking: Functional features in Groovy, Part 1.IBM developerWorks(12 november 2011).
(en)Ford, Neal,Functional thinking: Functional features in Groovy, Part 2.IBM developerWorks(20 december 2011).
(en)Ford, Neal,Functional thinking: Functional features in Groovy, Part 3.IBM developerWorks(31 januari 2012).
(en)Ford, Neal,Functional thinking: Functional design patterns, Part 1.IBM developerWorks(6 maart 2012).
(en)Ford, Neal,Functional thinking: Functional design patterns, Part 2.IBM developerWorks(3 april 2012).
(en)Ford, Neal,Functional thinking: Functional design patterns, Part 3.IBM developerWorks(15 mei 2012).
(en)Ford, Neal,Functional thinking: Functional error handling with Either and Option.IBM developerWorks(12 juni 2012).
(en)Ford, Neal,Functional thinking: Either trees and pattern matching.IBM developerWorks(10 juli 2012).
(en)Ford, Neal,Functional thinking: Rethinking dispatch.IBM developerWorks(21 augustus 2012).
(en)Ford, Neal,Functional thinking: Tons of transformations.IBM developerWorks(25 september 2012).
(en)Ford, Neal,Functional thinking: Transformations and optimizations.IBM developerWorks(16 oktober 2012).
(en)Ford, Neal,Functional thinking: Laziness, Part 1.IBM developerWorks(20 november 2012).
(en)Ford, Neal,Functional thinking: Laziness, Part 2.IBM developerWorks(19 december 2012).
(en)Ford, Neal,Functional thinking: Why functional programming is on the rise.IBM developerWorks(29 januari 2013).
Overgenomen van "https://nl.wikipedia.org/w/index.php?title=Functioneel_programmeren&oldid=67410963"
Categorie:

[8]ページ先頭

©2009-2026 Movatter.jp