diff --git a/Programmieren_mit_Higher-Order_Funktionen.html b/Programmieren_mit_Higher-Order_Funktionen.html index 66c0145..bb41b58 100644 --- a/Programmieren_mit_Higher-Order_Funktionen.html +++ b/Programmieren_mit_Higher-Order_Funktionen.html @@ -35,7 +35,7 @@ und #false die einzigen möglichen Argumente der Funktion sind, gibt es genau zwei Werte aus X die die Funktion liefern kann. Umgekehrt kann aus einem Paar aus X*X leicht eine Funktion vom Typ Bool -> X gemacht werden: Wenn das Argument #true ist, nimm die erste Komponente des Paars, bei #false das zweite.

15.3 Map, filter, flatmap

Weitere typische Higher-Order Funktionen für den Umgang mit Listen sind map, filter und flatmap. -Sie sind wie folgt definiert:

; [X Y] (X -> Y) (list-of X) -> (list-of Y)
(define (map f xs)
  (cond [(empty? xs) empty]
        [(cons? xs)
         (cons (f (first xs))
               (map f (rest xs)))]))
 
; [X] (X -> Boolean) (list-of X) -> (list-of X)
(define (filter f xs)
  (cond [(empty? xs) empty]
        [(cons? xs) (if (f (first xs))
                        (cons (first xs) (filter1 f (rest xs)))
                        (filter f (rest xs)))]))
 
; [X Y] (X -> (list-of Y)) (list-of X) -> (list-of Y)
(define (flatmap f xs)
  (foldr
    append
    empty
    (map f xs)))
Die ersten beiden Funktionen sind nahezu selbsterklärend. Die map Funktion wendet eine Funktion auf +Sie sind wie folgt definiert:

; [X Y] (X -> Y) (list-of X) -> (list-of Y)
(define (map f xs)
  (cond [(empty? xs) empty]
        [(cons? xs)
         (cons (f (first xs))
               (map f (rest xs)))]))
 
; [X] (X -> Boolean) (list-of X) -> (list-of X)
(define (filter f xs)
  (cond [(empty? xs) empty]
        [(cons? xs) (if (f (first xs))
                        (cons (first xs) (filter f (rest xs)))
                        (filter f (rest xs)))]))
 
; [X Y] (X -> (list-of Y)) (list-of X) -> (list-of Y)
(define (flatmap f xs)
  (foldr
    append
    empty
    (map f xs)))
Die ersten beiden Funktionen sind nahezu selbsterklärend. Die map Funktion wendet eine Funktion auf jedes Listenelement an und fügt die Ergebnisse wieder zu einer Liste zusammen.
> (map add1 (list 1 2 3))

(2 3 4)

Die filter Funktion gibt alle Elemente einer Liste zurück, für die eine boolsche Funktion #true ergibt.

> (filter even? (list 1 2 3 4))

(2 4)

Die map Funktion in der Racket Bibliothek kann sogar noch auf eine mächtigere Art und Weise benutzt