Entschuldigung für den vagen Titel, aber ein Teil dieser Frage ist, wie diese beiden Syntaxstile heißen:
let foo1 x =
match x with
| 1 -> "one"
| _ -> "not one"
let foo2 = function
| 1 -> "one"
| _ -> "not one"
Der andere Teil ist, welchen Unterschied es zwischen den beiden gibt und wann ich den einen oder anderen verwenden möchte?
Antworten:
Die Übereinstimmungsversion wird als "Mustervergleichsausdruck" bezeichnet. Die Funktionsversion wird als "Mustervergleichsfunktion" bezeichnet. Gefunden in Abschnitt 6.6.4 der Spezifikation .
Die Verwendung übereinander ist eine Frage des Stils. Ich bevorzuge die Verwendung der Funktionsversion nur, wenn ich eine Funktion definieren muss, die nur eine Übereinstimmungsanweisung ist.
quelle
Der Vorteil der zweiten Syntax ist, dass sie bei Verwendung in einem Lambda etwas knapper und lesbarer sein kann.
vs.
quelle
Die Funktionsversion ist eine Kurzform für die vollständige Übereinstimmungssyntax in dem speziellen Fall, in dem die Übereinstimmungsanweisung die gesamte Funktion ist und die Funktion nur ein einziges Argument hat (Tupel zählen als eins). Wenn Sie zwei Argumente haben möchten, müssen Sie die vollständige Übereinstimmungssyntax * verwenden. Sie können dies an den Typen der folgenden beiden Funktionen erkennen.
Wie Sie sehen können, verwendet die Match-Version zwei separate Argumente, während die Funktionsversion ein einzelnes Tupel-Argument verwendet. Ich verwende die Funktionsversion für die meisten Funktionen mit einzelnen Argumenten, da ich finde, dass die Funktionssyntax sauberer aussieht.
* Wenn Sie wirklich wollten, können Sie die Funktionsversion mit der richtigen Typensignatur erhalten, aber sie sieht meiner Meinung nach ziemlich hässlich aus - siehe Beispiel unten.
quelle
In Ihrem Fall machen sie dasselbe - das
function
Schlüsselwort verhält sich wie eine Kombination desfun
Schlüsselworts (um ein anonymes Lambda zu erzeugen) gefolgt vommatch
Schlüsselwort.Technisch gesehen sind diese beiden also identisch, mit dem Zusatz
fun
:quelle
fun
technisch definiert in Bezug auffunction | _ -> ...
?fun x y -> ...
wärefun x -> fun y -> ...
undfun x -> ...
wäre dannfunction | x -> ...
. Aus diesem Grund können Sie Musterabgleiche durchführen,fun
zfun (x::xs) -> ...
.Der Vollständigkeit halber bin ich gerade auf Seite 321 von Expert FSharp gekommen :
quelle
Die Funktion erlaubt nur ein Argument, aber den Mustervergleich, während Spaß die allgemeinere und flexiblere Art ist, eine Funktion zu definieren. Schauen Sie hier: http://caml.inria.fr/pub/docs/manual-ocaml/expr.html
quelle
Die beiden Syntaxen sind äquivalent. Die meisten Programmierer wählen den einen oder anderen und verwenden ihn dann konsequent.
Die erste Syntax bleibt besser lesbar, wenn die Funktion mehrere Argumente akzeptiert, bevor sie mit der Arbeit beginnt.
quelle
Dies ist eine alte Frage, aber ich werde meine $ 0,02 werfen.
Im Allgemeinen gefällt mir die
match
Version besser, da ich aus der Python-Welt komme, in der "explizit besser als implizit ist".Wenn Typinformationen zum Parameter benötigt werden, kann die
function
Version natürlich nicht verwendet werden.OTOH Ich mag das Argument von,
Stringer
also werde ich anfangen, esfunction
in einfachen Lambdas zu verwenden.quelle