あいまいなタイトルについては申し訳ありませんが、この質問の一部は、これら2つの構文スタイルの名前です。
let foo1 x =
match x with
| 1 -> "one"
| _ -> "not one"
let foo2 = function
| 1 -> "one"
| _ -> "not one"
他の部分は、2つの間にどのような違いがあるのか、そしていつどちらを使用したいのかということです。
回答:
一致バージョンは「パターンマッチング式」と呼ばれます。関数バージョンは「パターンマッチング関数」と呼ばれます。仕様のセクション6.6.4にありますます。
どちらか一方を使用するのはスタイルの問題です。matchステートメントのみの関数を定義する必要がある場合は、関数バージョンのみを使用することをお勧めします。
関数バージョンは、matchステートメントが関数全体であり、関数に引数が1つしかない(タプルは1つとしてカウントされる)特別な場合の完全一致構文の省略形です。2つの引数が必要な場合は、完全一致構文*を使用する必要があります。これは、次の2つの関数のタイプで確認できます。
//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 ??"
ご覧のとおり、match versionは2つの別々の引数を取りますが、functionversionは1つのtupled引数を取ります。関数の構文がすっきりしているので、ほとんどの単一引数関数に関数バージョンを使用します。
*本当に必要な場合は、関数バージョンに正しい型シグネチャを持たせることができますが、私の意見ではかなり醜いように見えます-以下の例を参照してください。
//val function_match_equivalent : string -> string -> string
let function_match_equivalent x y = (x, y) |> function
| "A", _ -> "Hello A"
| _, "B" -> "Hello B"
| _ -> "Hello ??"
彼らはあなたの場合と同じことをします-function
キーワードfun
はmatch
キーワードの後にキーワードが続く(匿名のラムダを生成するための)組み合わせのように機能します。
したがって、技術的には、これら2つは同じですが、fun
:が追加されています。
let foo1 = fun x ->
match x with
| 1 -> "one"
| _ -> "not one"
let foo2 = function
| 1 -> "one"
| _ -> "not one"
fun
、技術的に定義されていfunction | _ -> ...
ますか?
fun x y -> ...
は、、、fun x -> fun y -> ...
そしてにfun x -> ...
なりますfunction | x -> ...
。それはあなたがでパターンマッチングを行うことができます理由ですfun
例えば- fun (x::xs) -> ...
。
完全を期すために、ExpertFSharpの321ページにアクセスしました。
「リスト12-2は式形式を使用しています
function pattern-rules -> expression
。これは(fun x -> match x with pattern-rules -> expression)
、識別された共用体上で直接機能する関数を定義する方法と同等であり、特に便利です。」
関数は1つの引数のみを許可しますが、パターンマッチングを許可しますが、関数を定義するためのより一般的で柔軟な方法はfunです。ここを見てください:http://caml.inria.fr/pub/docs/manual-ocaml/expr.html