i

Fachkonzept - Funktion

Funktion als Verarbeitungseinheit

Als Beispiel betrachten wir eine Berechnungssituation beim Pyramidenbau. Wer eine Pyramide bauen will, sollte vorab den Materialbedarf an Steinen abschätzen. Das Volumen einer quadratischen Pyramide mit einer vorgegebenen Länge der Grundseite und einer vorgegebenen Höhe berechnet man mit folgender Formel:

$\begin{array}{lclcl} \text{Volumen} & = & \displaystyle\frac{1}{3} \cdot \text{Grundfläche} \cdot \text{Höhe} = & \displaystyle\frac{1}{3} \cdot \text{Länge} \cdot \text{Länge} \cdot \text{Höhe} \end{array}$

Die Berechnung des Volumens einer Pyramide betrachten wir als Datenverarbeitungssituation, bei der aus gegebenen Daten neue Daten berechnet werden sollen. Die Verarbeitung der Daten konzipieren wir als Übergabe-Rückgabe-Situation mit einer Übergabe von Daten und einer Rückgabe von Daten. Hier eine informelle Beschreibung dieser Übergabe-Rückgabe-Situation mit exemplarischen Datenwerten.

Übergabe: 
- Länge der Grundseite [in m]: 230.3
- Höhe der Pyramide [in m]: 146.6
Rückgabe: 
- Volumen der Pyramide [in m3]: 2591794.66

Zur automatisierten Verarbeitung von Daten in einer solchen Übergabe-Rückgabe-Situation nutzt man das Funktionskonzept.

Eine Funktion ist eine Verarbeitungseinheit, die übergebene Datenwerte verarbeitet und einen daraus berechneten Datenwert als Funktionswert zurückgibt.

Funktion als Verarbeitungseinheit[1]

Modellierung einer Funktion

Bei der Modellierung einer Funktion legt man erste Bestandteile einer Funktion fest.

Signatur:
volumenPyramide: Float -> Float -> Float
Beispiele:
volumenPyramide 10.0 6.0 -> 200.0
volumenPyramide 230.3 146.6 -> 2591794.66

Mit dem Funktionsnamen wird die Verarbeitungseinheit bezeichnet. Mit diesem Namen wird sie dann in Anwendungssituationen aktiviert (siehe unten). Im vorliegenden Beispiel wurde der Funktionsname volumenPyramide bewählt.

Tipp: Benutze sprechende Bezeichner bei der Namensgebung. Günstig ist es, wenn die Funktion das bezeichnet, was berechnet werden soll. Benutze Bezeichner, die mit einem Kleinbuchstaben beginnen.

Mit der Signatur werden die Datentypen der Übergabedaten und des Rückgabedatums einer Funktion festgelegt.

Die Schreibweise volumenPyramide: Float -> Float -> Float bedeutet, dass zwei Datenwerte vom Typ Float übergeben werden (das geht aus den ersten beiden Angaben hervor) und dass ein Datenwert ebenfalls vom Typ Float zurückgegeben wird (das wird durch die letzte Angabe beschrieben). Wir werden diese Schreibweise an geeigneter Stelle genauer erklären. Du kannst sie dir in Gedanken auch so vorstellen: volumenPyramide: Float Float -> Float.

Mit Hilfe von Beispielen wird schließlich das Verhalten der Funktion exemplarisch beschrieben.

Alle diese Bestandteile sollte man bei der weiteren Festlegungen stimmig berücksichten.

Definition einer Funktion

Die Verarbeitung der übergebenen Daten wird mit einer Funktionsdefinition festgelegt. Diese Funktionsdefinition beschreibt, wie die übergebenen Datenwerte verarbeitet werden und aus ihnen der zurückgegebene Datenwert als Funktionswert berechnet wird.

Im Fall der Funktion volumenPyramide könnte die Funktionsdefinition so aussehen:

volumenPyramide laenge hoehe = 
    (1/3)*(laenge*laenge)*hoehe

Hier werden die Parameter laenge und hoehe benutzt um übergebene Datenwerte zu verwalten. Parameter sind Variablen, die als Stellvertreter für die übergebenen Datenwerte fungieren.

Beachte, dass Parameter in Elm ohne Klammern direkt hinter dem Funktionsnamen aufgelistet werden.

Die Verarbeitung der Daten wird mit Hilfe eines (Funktions-) Ausdrucks beschrieben. Im vorliegenden Beispiel ist das der Ausdruck (1/3)*(laenge*laenge)*hoehe.

Beachte, dass der Ausdruck entweder direkt hinter das Gleichheitszeichen geschrieben wird oder - wie oben zu sehen - eingerückt (in der Regel um 4 Einheiten) in der nächsten Zeile.

Definition einer Funktion[2]

Wenn du bereits Programmiererfahrung hast, dann beachte auch, dass die Verarbeitung nicht mit Anweisungen beschrieben wird, die Schritt für Schritt ausgeführt werden sollen. Mit einem Ausdruck wird vielmehr das zu berechnende Ergebnis beschrieben. Wir werden diese Sichtweise in den folgenden Kapiteln weiter vertiefen.

Aufruf einer Funktion

Mit einem Funktionsaufruf wird die Funktion als Verarbeitungseinheit aktiviert. Die im Aufruf übergebenen Datenwerte werden benutzt, um den Wert des Ausdrucks zu berechnen. Dieser Wert wird als berechneter Datenwert zurückgegeben.

Hier Beispiele von Funktionsaufrufen, die direkt in der REPL erfolgen, nachdem vorher die Funktionsdefinition ausgewertet wurde.

> volumenPyramide laenge hoehe =
|       (1/3)*(laenge*laenge)*hoehe
|
<function> : Float -> Float -> Float
> volumenPyramide 10.0 6.0
199.99999999999997 : Float
> volumenPyramide 230.3 145.6
2574115.3013333334 : Float

Die Auswertung des Funktionsaufrufs erfolgt, indem die übergebenen Datenwerte für die Parameter eingesetzt werden und der Ausdruck mit diesen Datenwerten ausgewertet wird.

volumenPyramide 230.3 145.6 ->
(1/3)*(230.3*230.3)*145.6 ->
2574115.3013333334

Beachte: Ein Funktionsaufruf setzt immer voraus, dass die Funktion bereits definiert wurde. Elm gibt als Zusatzinformation zum Rückgabedatum auch immer den Datentyp mit an.

Definition und Aufruf einer Funktion[3]

Schreibweisen

Elm nutzt eine Schreibweise für Funktionsaufrufe, die sich von der Schreibweise unterscheidet, die man üblicherweise in der Mathematik verwendet.

In der Mathematik werden die zu verarbeitenden Daten bei einem Funktionsaufruf immer in Klammern gesetzt.

f(x) = x2
f(2) = 4
V(l,h) = (1/3)*l*h
V(10,6) = 200

Elm lässt - wie einige andere funktionale Programmiersprachen - diese Klammern weg.

> f x = x^2
<function> : number -> number
> f 2
4 : number
> volumenPyramide laenge hoehe = (1/3)*(laenge*laenge)*hoehe
<function> : Float -> Float -> Float
> volumenPyramide 10.0 6.0
199.99999999999997 : Float

Beachte, dass man Funktionsaufrufe in komplexeren Ausdrücken dann auch anders darstellen muss.

f(2) * f(2) = 16
> (f 2) * (f 2)
16 : number

Funktionale Programmierung

Das hier präsentierte Beispiel verdeutlich bereits die Grundidee der funktionalen Programmierung.

Beim Lösen eines Datenverarbeitungsproblems werden (meist mehrere) Funktionen als Verarbeitungseinheiten konzipiert. Die zugehörigen Funktionsdefinitionen bilden dann ein funktionales Programm, das mit Hilfe eines Funktionsaufrufes aktiviert werden kann.

Im Beispiel ist das funktionale Programm sehr einfach gestrickt. In den folgenden Kapiteln werden wir Schritt für Schritt immer komplexere Verarbeitungssituation mit dann auch komplexeren funktionalen Programmen bearbeiten.

Quellen

Suche

v
110.2.2.4
inf-schule.de/fp_elm_alteversion/elm_programme/funktionen/konzept_funktion
inf-schule.de/110.2.2.4
inf-schule.de/@/page/dHxbkIfSTDHZUfY0

Rückmeldung geben