Cursus Raku / Functioneel, concurrent, reactief en webprogrammeren / Functioneel programmeren / Reductie
De routine reduce
Wanneer je met een eigen bewerking wilt reduceren in plaats van met
één benoemde operator, gebruik je de routine reduce. Zij
neemt een blok met twee argumenten aan en past het over de lijst toe,
waarbij ze het lopende resultaat meedraagt:
say (1..5).reduce(* + *); # 15Het blok * + * heeft twee Whatever-sterren: de eerste is het
resultaat tot nu toe, de tweede is het volgende element. Dus
reduce berekent ((((1 + 2) + 3) + 4) + 5), dat
wil zeggen 15 — hetzelfde als [+], maar als
blok geschreven.
Om die twee argumenten aan het werk te zien, geef je ze namen en druk
je elke stap af. Een pointy block geeft zijn laatste uitdrukking terug,
dus $x + $y is zowel waar het blok over afdrukt als de
waarde die het aan reduce teruggeeft:
say (1..5).reduce(
-> $x, $y {
say "$x + $y";
$x + $y;
}
);Dit drukt af:
1 + 2
3 + 3
6 + 4
10 + 5
15Elk van de eerste vier regels is één aanroep van het blok.
$x is het tot dan toe opgebouwde resultaat en
$y is het volgende element uit de lijst. De allereerste
aanroep krijgt de eerste twee waarden van de lijst, 1 en
2; elke latere aanroep krijgt de som van de vorige stap als
$x terug — 3, dan 6, dan
10 — gekoppeld aan het volgende getal als $y.
De waarde van het blok wordt de $x van de volgende aanroep,
en de eindsom, 15, is wat reduce teruggeeft en
say op de laatste regel afdrukt.
Omdat het blok van alles kan zijn, is reduce algemener.
Bouw bijvoorbeeld stap voor stap een waarde op:
say (1..4).reduce(-> $acc, $x { $acc * 10 + $x }); # 1234Elke stap vermenigvuldigt de accumulator met tien en telt het
volgende cijfer erbij op, waarmee de losse cijfers
1, 2, 3, 4 het getal 1234 worden.
Net als de andere methoden die een blok aannemen leest
reduce goed met de vorm met dubbele punt, die de haakjes om het
blok weglaat:
say (1..5).reduce: * + *; # 15Kort gezegd: [op] is de snelle vorm voor een benoemde
operator, en reduce is de flexibele vorm voor een
willekeurig combinerend blok. Beide vouwen een lijst tot één enkele
waarde samen.
Praktijk
Maak de 1 quiz over de inhoud van dit onderwerp.
Cursusnavigatie
← Quiz — De reductie-meta-operator | Quiz — Reductie →
💪 Of ga direct naar de oefeningen in deze
sectie.