4

私はF#にかなり慣れていないので、2つの値を (match ... with ...) 構文で比較したかった

次のように 2 つの値を比較しようとすると、問題が発生します。

let value1 = 19
let isValue1 y =
    match y with
    | value1 -> y + 1
    | _ -> y

コードの「| _ -> y」の部分に到達しないという警告が表示されます。どうしてこれなの?

関数を希望どおりに機能させるために、次のことができることを知っています。

let value1 = 19
let isValue1 y =
    match y with
    | _ when y = value1 -> true
    | _ -> false

これも同様に機能します

let value1 = 19
let isValue1 y =
    match y with
    | 19 -> true
    | _ -> false

なぜそれができないのか、そしてマッチが実際にどのように機能するのかが気になります。

4

3 に答える 3

11

match ステートメント内の value1 は新しい変数として定義され、その値は (一致として) y に設定されます。上記で定義した value1 は、クラス変数と同じ名前の C# 関数でローカル変数を宣言した場合と同様に無視されます。このため、最初の一致条件は、以前に定義された value1 の値だけでなく、すべてに一致するため、エラーが発生します。問題が明確になることを願っています。

于 2009-01-26T18:15:16.383 に答える
6

パターン マッチングは、制御構造 (次に実行されるコード) とバインディング構造 (名前を値にバインドする「let」など) の両方です。だからあなたがするとき

match expr with
| name -> ...

パターン (「名前」) は常に一致し、識別子「名前」は式の値にバインドされます。これが、構造に基づいて照合する識別共用体 (ケース タイプ) でパターン マッチングが主に使用される理由です。例えば

match someOption with
| Some(x) -> ... // binds x
| None -> ...

match someList with
| h :: t -> ... // binds h and t to head/tail
| [] -> ...
于 2009-01-26T18:25:17.457 に答える