今、私は奇妙に動作しているネストされたパターンマッチを持っています。ここでこのF#ネストマッチ式が正しく機能しないのはなぜですか?
は、コードスニペット残念ながら
match setting with
| "-f" | "--file" -> // Open file
({ state with file = Some (cur_dir + "\\" + elem) }, "")
| "" -> // Option without parameter
match elem with
| "-h" | "--help" -> // Display help message
({ state with help = true }, "")
| "-r" | "--readonly" -> // Open with readonly
({ state with readonly = true }, "")
| opt -> (state, opt)
| _ -> (state, "") // Ignore invalid option
である私は上記のコードをコンパイルするとき、私は2つの警告を取得します。最後のワイルドカードパターンに到達できないことが示されます。もう1つは、最初の一致ステートメントが不完全であることを示します。
この2つの警告は互いに矛盾しているようですが、式をより明確にするためにかっこを追加すると、警告が消え、コードが正しく機能します。
match setting with
| "-f" | "--file" -> // Open file
({ state with file = Some (cur_dir + "\\" + elem) }, "")
| "" -> // Option without parameter
(match elem with
| "-h" | "--help" -> // Display help message
({ state with help = true }, "")
| "-r" | "--readonly" -> // Open with readonly
({ state with readonly = true }, "")
| opt -> (state, opt))
| _ -> (state, "") // Ignore invalid option
私の質問は次のとおりです。元のコードで何が間違っていましたか?誤った括弧の場合ではなく、コンパイラがそれぞれのマッチが終わるところが明白であるように思えます。
編集:ここでは、完全な機能があります、ケースにはそれが
let process_args argv =
let (result, _) = ((default_settings, "-f"), argv) ||>
Array.fold (fun (state, setting) elem ->
match setting with
| "-f" | "--file" -> // Open file
({ state with file = Some (cur_dir + "\\" + elem) }, "")
| "" -> // Option without parameter
match elem with
| "-h" | "--help" -> // Display help message
({ state with help = true }, "")
| "-r" | "--readonly" -> // Open with readonly
({ state with readonly = true }, "")
| opt -> (state, opt)
| _ -> (state, "") // Ignore invalid option
) in
result
を助け、私はまた、このエラーは、光と詳細な構文の両方で発生することに注意してください。
Edit2:わずかに変更された関数を誤って貼り付けたため、警告だけでなくコンパイルエラーが発生しました。謝罪いたします。
let process_args argv =
let (result, _) = ((default_settings, "-f"), argv)
||> Array.fold (fun (state, setting) elem ->
// (snip rest of function)
2つのエラーがlet (result, _) = ...
のlet
にあり、||>
オペレータに:私はVSコードにあなたの完全な機能をコピーすると
あなたの例は私にとってうまくいきます。ほぼ間違いなくインデントエラーです。 – Ringil
この例題は、ソースコードからそのままコピー&ペーストされています。また、「#ライト」をオフにしたかどうかにかかわらず、エラーが発生します。 – idlys
マッチステートメントをVSコードにコピーすると、Ionideプラグインに警告が表示されません。しかし、あなたの完全な 'process_args'関数をコピーすると、' let'ステートメントでインデントエラーが発生します。私は完全な答えを書くつもりですが、短いバージョン(あなたが待つ必要はありません)は次のとおりです: '((default_settingsなどのタプルを次の行に移動して4つのスペースをインデントし、変更して、あなたのコードがうまくいくはずです – rmunn