racket
Funkcje wyższego rzędu
Szukaj…
Mapa
Mapa stosuje funkcję do każdego elementu listy:
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")
Zagięcie
Fold Right kolejno stosuje funkcję dwóch argumentów do każdego elementu na liście od lewej do prawej, zaczynając od wartości podstawowej:
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)
Fold Left wykonuje tę samą akcję w przeciwnym kierunku:
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)
Filtr
filter
zwraca listę każdego elementu z podanej listy, dla którego dany predykat zwraca wartość inną niż #f
.
;; 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)
Komponować
Umożliwia skomponowanie kilku funkcji f₀ f₁ … fₙ
. Zwraca funkcję, która sukcesywnie zastosuje fₙ
do swoich argumentów, a następnie fₙ₋₁
do wyniku fₙ
i tak dalej. Funkcje są stosowane od prawej do lewej, tak jak w przypadku kompozycji funkcji matematycznych: (f ∘ g ∘ h)(x) = f(g(h(x)))
.
> ((compose sqrt +) 16 9)
5
> ((compose - sqrt) 16)
-4
Ariancja każdej funkcji powinna obejmować liczbę zwróconych wartości funkcji bezpośrednio po jej prawej stronie. Funkcja znajdująca się po prawej stronie określa arsenał całej kompozycji. Funkcja compose1 narzuca, że funkcje zwracają 1 wartość i oczekują 1 argumentu. Jednak compose1 nie ogranicza arity wejściowej ostatniej funkcji ani arianowości wyjściowej pierwszej funkcji.
[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...:
Curry
Zwraca częściowo zastosowaną funkcję.
> ((curry + 10) 20)
30
curryr
może być używany, gdy argumenty należy wstawić na końcu. Innymi słowy, (curryr list 1 2)
wygeneruje funkcję oczekującą new-arguments ...
Po wywołaniu ta nowa funkcja z kolei wywołuje (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