19

通常、F# では、パターン変数が同じパターンで 2 回発生することは許可されていません。しかし、次のコードでは、F# は文句を言いません。これはバグですか?

type foo = { A: int }
let test (x, {A = x}) = x
let result = test ("bla", {A = 3})
4

1 に答える 1

5

紛らわしいように見えますが、これはバグではないと思いますが、これはコンパイラが上記の値バインディングをコンパイルする方法にすぎません。

セクション14.6.3は、値の定義が単一の値のパターンではない場合(ここでの場合のように)、詳細な式は次のようになると述べています。

tmp <typars1… typarsn> = expr
ident1 <typars1> = expr1
…
identn <typarsn> = exprn

ここで、tmpは新しい識別子であり、各expriは、[仕様からの]入力tmpに対するパターンpat(§7)のコンパイルの結果です。

コンパイラが何をするかを確認するには、F#引用符を使用できます。例:

<@ let test (x:int, {A = x:int})= x in test (3, {A = 5}) @>;;

文字列形式で私は(いくつかのものを省いて)得ます:

Let (test,
     Lambda (tupledArg,
             Let (x, TupleGet (tupledArg, 0),
                  Let (_arg1, TupleGet (tupledArg, 1),
                       Let (x, PropertyGet (Some (_arg1), A, []), x)))),
     Application (test, NewTuple (Value (3), NewRecord (foo, Value (5)))))

これが「内部」xを取得する理由です。

バグではないと思いますが、これが警告を生成する場合は、おそらくより一貫性があります。

于 2012-12-07T17:46:32.453 に答える