i

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.

Suche

v
110.2.11.4
inf-schule.de/fp_elm_alteversion/elm_programme/funktionenalsdaten/konzept_funktionalsdatenwert
inf-schule.de/110.2.11.4
inf-schule.de/@/page/N0K9DU7UtwEVmxKa

Rückmeldung geben