Maaf tentang judul yang tidak jelas, tetapi bagian dari pertanyaan ini adalah apa nama kedua gaya sintaks ini:
let foo1 x =
match x with
| 1 -> "one"
| _ -> "not one"
let foo2 = function
| 1 -> "one"
| _ -> "not one"
Bagian lainnya adalah apa perbedaan antara keduanya, dan kapan saya ingin menggunakan salah satunya?
Pro untuk sintaks kedua adalah ketika digunakan dalam lambda, itu bisa sedikit lebih singkat dan mudah dibaca.
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]
sumber
Versi fungsi adalah kependekan dari sintaks pencocokan penuh dalam kasus khusus di mana pernyataan kecocokan adalah keseluruhan fungsi dan fungsi hanya memiliki satu argumen (tupel dihitung sebagai satu). Jika Anda ingin memiliki dua argumen, maka Anda perlu menggunakan sintaks pencocokan penuh *. Anda dapat melihat ini dalam tipe dari dua fungsi berikut.
//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 ??"
Seperti yang Anda lihat, versi pencocokan membutuhkan dua argumen terpisah sedangkan versi fungsi menggunakan satu argumen tuple. Saya menggunakan versi fungsi untuk sebagian besar fungsi argumen karena saya menemukan sintaks fungsi terlihat lebih bersih.
* Jika Anda benar-benar ingin, Anda bisa mendapatkan versi fungsi untuk memiliki tanda tangan tipe yang tepat tetapi menurut saya tampilannya cukup jelek - lihat contoh di bawah.
//val function_match_equivalent : string -> string -> string let function_match_equivalent x y = (x, y) |> function | "A", _ -> "Hello A" | _, "B" -> "Hello B" | _ -> "Hello ??"
sumber
Mereka melakukan hal yang sama dalam kasus Anda -
function
kata kunci bertindak seperti kombinasifun
kata kunci (untuk menghasilkan lambda anonim) diikuti denganmatch
kata kunci.Jadi secara teknis keduanya sama, dengan tambahan a
fun
:let foo1 = fun x -> match x with | 1 -> "one" | _ -> "not one" let foo2 = function | 1 -> "one" | _ -> "not one"
sumber
fun
secara teknis didefinisikan dalam istilahfunction | _ -> ...
?fun x y -> ...
akan menjadifun x -> fun y -> ...
, dan kemudianfun x -> ...
akanfunction | x -> ...
. Itu sebabnya Anda dapat melakukan pencocokan pola difun
- misfun (x::xs) -> ...
.Demi kelengkapan, saya baru saja sampai ke halaman 321 dari Expert FSharp :
sumber
function hanya memungkinkan untuk satu argumen tetapi memungkinkan untuk pencocokan pola, sedangkan fun adalah cara yang lebih umum dan fleksibel untuk mendefinisikan suatu fungsi. Lihat di sini: http://caml.inria.fr/pub/docs/manual-ocaml/expr.html
sumber
Kedua sintaks itu setara. Kebanyakan programmer memilih satu atau yang lain dan kemudian menggunakannya secara konsisten.
Sintaks pertama tetap lebih mudah dibaca saat fungsi menerima beberapa argumen sebelum mulai bekerja.
sumber
Ini adalah pertanyaan lama tapi saya akan membuang $ 0,02 saya.
Secara umum saya lebih suka
match
versinya karena saya berasal dari dunia Python di mana "eksplisit lebih baik daripada implisit."Tentu saja jika informasi tipe pada parameter diperlukan,
function
versi tersebut tidak dapat digunakan.OTOH Saya suka argumen yang dibuat oleh
Stringer
jadi saya akan mulai menggunakanfunction
lambda sederhana.sumber