2

このコンパイラは次のようになります。

let test Xf Yf = Xf + Yf

このコンパイラは好きではありません:

let test Xfd Yfd = Xfd + Yfd

警告:大文字の変数識別子は通常、パターンで使用されるべきではなく、スペルミスのパターン名を示している可能性があります。

たぶん私は適切にグーグルしていませんが、これが関数パラメーターの場合である理由を説明するものを何とか追跡することができませんでした...

4

2 に答える 2

6

このエラーメッセージは少し不思議に見えることに同意しますが、それには十分な動機があります。F#の命名ガイドラインによると、識別された共用体のケースにはを使用して名前を付ける必要がPascalCaseあり、コンパイラーは、パターンマッチングでケースの名前のスペルを誤って間違えないように努めています。

たとえば、次のユニオンがある場合:

type Side = 
  | Left 
  | Right

Left引数が「間違っている」場合に「ok」を出力する次の関数を記述できます。そうでなければ:

let foo a = 
  match a with 
  | Lef -> printfn "ok"
  | _ -> printfn "wrong!"

コードにタイプミスがあります-私が書いたばかりですLef-しかし、コードはまだ有効です。これLefは、新しい変数として解釈できるため、マッチングによって任意の側が割り当てられLef、常に最初のケースが実行されるためです。大文字の識別子に関する警告は、これを回避するのに役立ちます。

于 2012-05-25T09:49:47.393 に答える
1

F#はアクティブなパターンのケースルールを適用しようとします-このコードが何をするかを検討してください

let f X = 
    match X with
    |X -> 1
    |_ -> 2

これはかなり紛らわしいです。また、関数パラメータはパターンに似ています、あなたはすることができます

let f (a,b,_) = a,b

例えば。3番目の文字が警告をトリガーする理由はよくわかりませんが

于 2012-05-25T08:08:21.187 に答える