Ich lerne Programmier-Paradigmen an meiner Universität und lese dieses Kursmaterial, das vom Dozenten zur Verfügung gestellt wurde, der eine Funktion auf diese Weise definiert hat:
%Vor%Aber aus meinen eigenen Studien habe ich gelernt und mich daran gewöhnt, die gleiche Funktion wie folgt zu definieren:
%Vor%Ich bin neu in Scala. Und beide Definitionen ergeben ein Ergebnis von:
%Vor% Beim Übergeben von 4
als Parameter.
Nun, meine Hauptfrage ist, warum würde der Dozent lieber val
verwenden, um eine Funktion zu definieren? Ich sehe es länger und nicht wirklich notwendig, es sei denn, val
verwendet einige zusätzliche Vorteile, die ich nicht kenne. Außerdem verstehe ich mit val
macht einen Namen einen Platzhalter so später im Programm, ich könnte fälschlicherweise val double = 5
schreiben und die Funktion wäre weg!
In diesem Stadium bin ich ziemlich überzeugt, dass ich eine bessere Art gelernt habe, eine Funktion zu definieren, es sei denn, jemand würde mir etwas anderes sagen.
Streng genommen ist def d (x: Int) = 2 * x
eine Methode, keine Funktion, aber scala kann Methoden für uns transparent in Funktionen umwandeln. Das bedeutet, dass Sie die Methode d
überall verwenden können, die eine Int => Int
Funktion benötigt.
Es gibt einen kleinen Aufwand für die Durchführung dieser Konvertierung, da jedes Mal eine neue Function-Instanz erstellt wird. Wir können dies hier sehen:
%Vor%Was zu einer Ausgabe wie folgt führt:
%Vor% Sie können sehen, wenn eine Funktion explizit mit val
definiert wird, erstellt unser Programm nur eine einzelne Funktion und verwendet sie erneut, wenn wir als Argument an printFunc
übergeben (wir sehen den gleichen Hash-Code). Wenn wir def
verwenden, erfolgt die Umwandlung in eine Funktion jedes Mal, wenn wir sie an printFunc
übergeben, und wir erstellen mehrere Instanzen der Funktion mit unterschiedlichen Hash-Codes. Probieren Sie es aus
Das heißt, der Leistungsaufwand ist gering und macht für unser Programm oft keinen wirklichen Unterschied. Deshalb werden def
s oft dazu benutzt, Funktionen zu definieren, da viele Leute sie prägnanter und einfacher zu lesen finden.
In Scala sind Funktionswerte monomorph (d. h. sie können keine Typparameter haben, auch bekannt als "Generika"). Wenn Sie eine polymorphe Funktion wünschen, müssen Sie dies umgehen, indem Sie sie beispielsweise mit einer Methode definieren:
%Vor% Es wäre keine gültige Syntax, um val headOption[A]
zu schreiben. Beachten Sie, dass dies keinen polymorphen Funktionswert ergibt, sondern nur eine polymorphe Methode, die einen monomorphen Funktionswert des entsprechenden Typs zurückgibt.
Weil Sie etwas wie das Folgende haben könnten:
%Vor%So ist sein Zweck mit einem sehr einfachen Beispiel nicht offensichtlich. Aber dieser Function-Wert könnte selbst an Funktionen höherer Ordnung übergeben werden: Funktionen, die Funktionen als Parameter annehmen. Wenn Sie in der Dokumentation der Scala-Sammlungen nachschauen, werden Sie zahlreiche Methoden sehen, die Funktionen als Parameter annehmen. Es ist ein sehr leistungsfähiges und vielseitiges Werkzeug, aber Sie müssen eine gewisse Komplexität und Vertrautheit mit Algorithmen erreichen, bevor das Kosten-Nutzen-Verhältnis offensichtlich wird.
Ich würde auch vorschlagen, "double" nicht als Bezeichnernamen zu verwenden. Obwohl Scala legal ist, ist es leicht, es mit dem Typ Double zu verwechseln.
Tags und Links scala functional-programming function