Fachkonzept - Funktion höherer Ordnung
Grundidee und Präzisierung
Im letzten Abschnitt wurde u.a. der map-Operator eingeführt. Die vordefinierte Funktion List.map
verarbeitet eine übergebene Funktion, die auf alle Elemente einer übergebenen Liste angewandt wird.
> f x = -x
<function> : number -> number
> List.map f [3,0,-6,4]
[-3,0,6,-4] : List number
Die Funktion List.map
ist demach eine Funktion, die andere Funktionen als Datenwerte verarbeitet.
Eine solche Funktion wird auch Funktion höherer Ordnung genannt.
Eine Funktion höherer Ordnung ist eine Funktion, bei der unter den Übergabe- und Rückgabedaten mindestens eine Funktion als Datenwert vorkommt.
Definition einer Funktion höherer Ordnung
Als Beispiel betrachten wir die Bestimmung des Maximums von zwei Datenwerten.
Der folgende Quelltext zeigt verschiedene Implementierungen.
module FunktionenAlsDaten exposing (..)
maxZahl: number -> number -> number
maxZahl zahl1 zahl2 =
if zahl1 >= zahl2 then zahl1 else zahl2
maxListeLaenge: List a -> List a -> List a
maxListeLaenge liste1 liste2 =
if (List.length liste1) >= (List.length liste2) then liste1 else liste2
maxListeSumme: List number -> List number -> List number
maxListeSumme liste1 liste2 =
if (List.sum liste1) >= (List.sum liste2) then liste1 else liste2
import FunktionenAlsDaten exposing (..)
> maxZahl 3 2
3 : number
> maxListeLaenge [7] [5,0]
[5,0] : List number
> maxListeSumme [7] [5,0]
[7] : List number
Es fällt auf, dass die drei Funktionen maxZahl
, maxListLaenge
und maxSumme
völlig analog aufgebaut sind.
Sie unterscheiden sich nur in der benutzten Vergleichsfunktion.
In einer solchen Situation ist es günstig, wenn man eine verallgemeinerte Funktion maxDatenwert
entwickelt, die
eine Vergleichsfunktion als zusätzlichen Datenwert übergeben bekommt.
module FunktionenAlsDaten exposing (..)
maxDatenwert: (a -> a -> Bool) -> a -> a -> a
maxDatenwert gFunktion datenwert1 datenwert2 =
if gFunktion datenwert1 datenwert2 then datenwert1 else datenwert2
import FunktionenAlsDaten exposing (..)
> maxDatenwert (>=) 3 2
3 : number
> gListeLaenge liste1 liste2 = (List.length liste1 >= List.length liste2)
<function> : List a1 -> List a -> Bool
> maxDatenwert gListeLaenge [7] [5,0]
[5,0] : List number
> gListeSumme liste1 liste2 = (List.sum liste1 >= List.sum liste2)
<function> : List number -> List number -> Bool
> maxDatenwert gListeSumme [7] [5,0]
[7] : List number
Die Funktion maxDatenwert
ist eine Funktion höherer Ordnung, da sie u.a. eine Funktion als Datenwert verarbeitet.
Der Vorteil beim Einsatz von Funktionen höherer Ordnung besteht darin, dass man Codeduplizierung vermeidet und strukturelle Zusammenhänge besser modellieren kann.