Die Funktionsversion ist ein Kurzzeichen für die vollständige Übereinstimmungssyntax im Sonderfall, in dem die Match-Anweisung 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 in den Typen der folgenden zwei Funktionen sehen.
//val match_test : string -> string -> string
let match_test x y = match x, y with
| "A", _ -> "Hello A"
| _, "B" -> "Hello B"
| _ -> "Hello ??"
//val function_test : string * string -> string
let function_test = function
| "A", _ -> "Hello A"
| _, "B" -> "Hello B"
| _ -> "Hello ??"
Wie Sie sehen können, benötigt die Match-Version zwei separate Argumente, während die Funktionsversion ein einzelnes Tupel-Argument benötigt. Ich benutze die Funktionsversion für die meisten einzelnen Argumentfunktionen, da ich finde, dass die Funktionssyntax sauberer aussieht.
* Wenn Sie wirklich wollten, können Sie die Funktionsversion erhalten, um die richtige Art Unterschrift zu haben, aber es sieht meiner Meinung nach ziemlich hässlich aus - siehe Beispiel unten.
//val function_match_equivalent : string -> string -> string
let function_match_equivalent x y = (x, y) |> function
| "A", _ -> "Hello A"
| _, "B" -> "Hello B"
| _ -> "Hello ??"
Ist es nicht anders herum - also 'Fun' ist technisch definiert in Bezug auf' Funktion | _ -> ... '? –
Um genau zu sein, 'Spaß x y -> ...' wäre 'Spaß x -> Spaß y -> ...', und dann 'Spaß x -> ...' wäre 'Funktion | x -> ... '. Deshalb können Sie in 'fun' Mustervergleiche vornehmen - z. 'Spaß (x :: xs) -> ...'. –