racket
Hogere orderfuncties
Zoeken…
Kaart
Kaart past een functie toe op elk element van een lijst:
map: (a -> b) (listof a) -> (listof b)
> (map (lambda (x) (* x 2)) (list 1 2 3 4 5)
(list 2 4 6 8 10)
> (map sqrt (list 1 4 9))
(list 1 2 3)
> (map (lambda (x) (if (even? x) "even" "odd")) (list 1 2 3))
(list "odd" "even" "odd")
Vouwen
Vouw rechts past achtereenvolgens een functie met twee argumenten toe op elk element in een lijst van links naar rechts, beginnend met een basiswaarde:
foldr: (a b -> b) b (listof a) -> b
> (foldr + 0 (list 1 2 3 4))
10
> (foldr string-append "" (list "h" "e" "l" "l" "o"))
"hello"
> (foldr cons empty (list 1 2 3 4))
(list 1 2 3 4)
Links vouwen voert dezelfde actie in de tegenovergestelde richting uit:
foldl: (a b -> b) b (listof a) -> b
> (foldl + 0 (list 1 2 3 4)
10
> (foldl string-append "" (list "h" "e" "l" "l" "o"))
"olleh"
> (foldl cons empty (list 1 2 3 4))
(list 4 3 2 1)
Filter
filter
retourneert een lijst van elk item in de gegeven lijst waarvoor het gegeven predicaat een niet- #f
waarde retourneert.
;; Get only even numbers in a list
> (filter even? '(1 2 3 4))
'(2 4)
;; Get all square numbers from 1 to 100
> (filter (lambda (n) (integer? (sqrt n))) (range 1 100))
'(1 4 9 16 25 36 49 64 81)
Componeren
Hiermee kunt u verschillende functies samenstellen f₀ f₁ … fₙ
. Het retourneert een functie die achtereenvolgens fₙ
op zijn argumenten fₙ₋₁
en vervolgens fₙ₋₁
op het resultaat van fₙ
enzovoort. Functie wordt van rechts naar links toegepast, zoals voor wiskundige functiesamenstelling: (f ∘ g ∘ h)(x) = f(g(h(x)))
.
> ((compose sqrt +) 16 9)
5
> ((compose - sqrt) 16)
-4
De arity van elke functie moet het aantal geretourneerde waarden van de functie direct rechts bevatten. De meest rechtse functie bepaalt de arity van de hele compositie. De functie compose1 impliceert dat de functies 1 waarde retourneren en 1 argument verwachten. Compose1 beperkt echter niet de invoerariteit van de laatste functie, noch de uitvoerariteit van de eerste functie.
[n input]--> first-function -->[1 output]--> ... last function -->[m output].
((compose + values) 1 2 3 4)
10
> ((compose1 + values) 1 2 3 4)
XX result arity mismatch;
expected number of values not received
expected: 1
received: 4
values...:
Kerrie
Retourneert een gedeeltelijk toegepaste functie.
> ((curry + 10) 20)
30
curryr
kan worden gebruikt wanneer de argumenten aan het einde moeten worden ingevoegd. Met andere woorden, (curryr list 1 2)
zal een functie produceren die enkele new-arguments ...
Wanneer de functie wordt aangeroepen, wordt deze op zijn beurt opgeroepen (list new-arguments ... 1 2)
.
> (((curryr list) 1 2) 3 4)
'(3 4 1 2)
> ((curryr list 1 2) 3 4)
'(3 4 1 2)
> ((curryr - 30) 40)
10
> (((curryr -) 30 40))
10