Skip to content

Functional programming

Stein Bergervoet edited this page Nov 4, 2021 · 4 revisions

Functional programming

Het paradigma

Functioneel programmeren in een manier van programmeren waar functies centraal staan. Functies bepalen hier de structuur van de code. In functioneel programmeren is het niet toegestaan om variabelen die buiten de scope van een functie worden gedeclareerd te modelleren. Functies nemen dus een input en geven gebaseerd op deze input een waarde terug. Op deze manier kunnen functies onder andere goed hergebruikt worden.

In functioneel programmeren wordt een functie beschouwd als een ‘first order citizen’. Dit betekent dat een functie, net als een variabele, het volgende moet kunnen doen:

  • In een variabele opgeslagen worden;
  • Een andere functie als parameter mee krijgen;
  • Een andere functie kan returnen.

Deze drie dingen zijn allemaal mogelijk in JavaScript waardoor functional programming toegepast kan worden.

Pure versus impure functies

In functioneel programmeren wordt er een onderscheid gemaakt tussen pure en impure functies gemaakt. Het paradigma raad je aan om pure functies te schrijven. Een functie is pure zodra hij aan twee voorwaarden voldoet, namelijk:

  • Een functie moet altijd met dezelfde input dezelfde waarde teruggeven.
  • Een functie mag geen bijwerkingen hebben. Denk hierbij aan bijvoorbeeld het gebruik van console.log of het veranderen van een object uit zijn eigen scope.

Hier staat een voorbeeld van een simpele pure functie. De functie add() voldoet namelijk aan beide voorwaarden. Dezelfde input zal altijd dezelfde uitkomst geven en de functie heeft geen bijwerkingen.

// Voorbeeld van een pure functie.
function add(a, b) {
  return a + b;
}

Hieronder staat een voorbeeld van een impure functie. De functie addRandom() voegt een willekeurige waarde van 0 tot en met 100 toe aan de input. Dezelfde input zal hier dus niet gegarandeerd dezelfde uitkomst geven.

// Voorbeeld van een impure functie.
function addRandom(x) {
  return Math.floor(Math.random() * 100) + x;
}

De volgende functie is ondanks dat hij op het eerste gezicht puur lijkt toch impure. Dit komt omdat de variabele ten buiten de scope van de functie wordt gedeclareerd met de let statement. Deze variabele kan dus buiten de scope van de functie worden aangepast. Het is dus niet gegarandeerd dat de functie met dezelfde input dezelfde output zal geven. De functie is dus niet puur.

// Voorbeeld van een impure functie.
let ten = 10;

function add10(x) {
  return x + ten;
}

Higher order functions

In functioneel programmeren is een functie een zogenaamde first order citizen. Dit betekent onder andere dat een meegegeven kan worden als parameter aan een andere functie. De functie die een andere functie als parameter ontvangt heet een higher order functie.

function add(x) {
  return (y) => x + y;
}

const addFive = add(5);
console.log(addFive(20));
// In de console: 25

Immutability

Hieronder staat een van de vorige voorbeelden van een impure functie met een kleine aanpassing. In het voorbeeld is de variabele ten nu een constante. Omdat deze variabele nu een constante is, en dus niet aangepast kan worden, zal de functie wel altijd dezelfde waarde teruggeven met dezelfde input. De variabele ten is nu immutable waardoor de functie puur is geworden.

// Voorbeeld van een pure functie.
const ten = 10;

function add10(x) {
  return x + ten;
}

Immutability gaat ook er ook over dat men in functional programming niet direct variabelen moet aanpassen. Er moet juist eerst een kopie van de data gemaakt worden om daarna deze kopie aan te passen er terug te geven.

Bronnen

Klik hier om te lezen hoe ik tijdens de eerste week de data uit de enquete lokaal heb ingeladen.

Clone this wiki locally