Przepraszamy za niejasny tytuł, ale część tego pytania dotyczy nazw tych dwóch stylów składni:
let foo1 x =
match x with
| 1 -> "one"
| _ -> "not one"
let foo2 = function
| 1 -> "one"
| _ -> "not one"
Druga część to jaka jest różnica między tymi dwoma i kiedy chciałbym użyć jednego lub drugiego?
Zaletą drugiej składni jest to, że gdy jest używany w lambdzie, może być nieco bardziej zwięzły i czytelny.
List.map (fun x -> match x with | 1 -> "one" | _ -> "not one") [0;1;2;3;1]
vs
List.map (function 1 -> "one" | _ -> "not one") [0;1;2;3;1]
źródło
Wersja funkcji to krótka wskazówka dla pełnej składni dopasowania w specjalnym przypadku, gdy instrukcja match to cała funkcja, a funkcja ma tylko jeden argument (krotki liczą się jako jeden). Jeśli chcesz mieć dwa argumenty, musisz użyć pełnej składni dopasowania *. Można to zobaczyć w typach następujących dwóch funkcji.
//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 ??"
Jak widać, wersja dopasowania przyjmuje dwa oddzielne argumenty, podczas gdy wersja funkcji przyjmuje jeden argument krotny. Używam wersji funkcji dla większości funkcji jednoargumentowych, ponieważ uważam, że składnia funkcji wygląda na czystszą.
* Jeśli naprawdę chciałeś, możesz sprawić, by wersja funkcji miała odpowiedni podpis typu, ale moim zdaniem wygląda to dość brzydko - patrz przykład poniżej.
//val function_match_equivalent : string -> string -> string let function_match_equivalent x y = (x, y) |> function | "A", _ -> "Hello A" | _, "B" -> "Hello B" | _ -> "Hello ??"
źródło
Robią to samo w twoim przypadku -
function
słowo kluczowe działa jak kombinacjafun
słowa kluczowego (w celu utworzenia anonimowej lambdy), po której następujematch
słowo kluczowe.Więc technicznie te dwa są takie same, z dodatkiem
fun
:let foo1 = fun x -> match x with | 1 -> "one" | _ -> "not one" let foo2 = function | 1 -> "one" | _ -> "not one"
źródło
fun
Jest technicznie zdefiniowane w kategoriachfunction | _ -> ...
?fun x y -> ...
będziefun x -> fun y -> ...
, a potemfun x -> ...
będziefunction | x -> ...
. Dlatego możesz dopasować wzorce wfun
- npfun (x::xs) -> ...
.Ze względu na kompletność dotarłem do strony 321 Expert FSharp :
źródło
funkcja pozwala tylko na jeden argument, ale pozwala na dopasowanie do wzorca, podczas gdy zabawa jest bardziej ogólnym i elastycznym sposobem definiowania funkcji. Spójrz tutaj: http://caml.inria.fr/pub/docs/manual-ocaml/expr.html
źródło
Te dwie składnie są równoważne. Większość programistów wybiera jedną lub drugą, a następnie używa jej konsekwentnie.
Pierwsza składnia pozostaje bardziej czytelna, gdy funkcja przyjmuje kilka argumentów przed rozpoczęciem pracy.
źródło
To stare pytanie, ale rzucę 0,02 dolara.
Ogólnie bardziej podoba mi się
match
wersja, ponieważ pochodzę ze świata Pythona, w którym „jawne jest lepsze niż niejawne”.Oczywiście, jeśli potrzebne są informacje o typie parametru,
function
nie można użyć wersji.OTOH Podoba mi się argument przedstawiony przez,
Stringer
więc zacznę używaćfunction
w prostych lambdach.źródło