4

F#パワーパックの見積もり評価で問題が発生しています。

open Microsoft.FSharp.Linq.QuotationEvaluation

let print x = System.Console.WriteLine(sprintf "%A" x)

type record = { x:int; y:int }
let val1 = { x = 1; y = 1; }
let val2 = { x = 1; y = 1; }
let result = val1 = val2
print result

let quote = <@ let value1 = { x = 1; y = 1; }
               let value2 = { x = 1; y = 1; }
               let result2 = value1 = value2
               result2 @>

print (quote.EvalUntyped())

あなたが期待するように、最初の結果は真実です。2番目は誤りです。これはバグですか、それとも何かが足りませんか?

4

1 に答える 1

7

これは私にはバグのように見えます。F#チームの誰かがおそらくこれについて明確な答えを与えるでしょう:-)。それまでの間、使用できる簡単な回避策を次に示します。問題は、=演算子のコンパイルにあるようです。独自の演算子(または関数)を定義し、引用符で囲まれたコードからこの演算子を呼び出すことができます。

let (><) a b = a = b
let quote = 
 <@ let value1 = { x = 1; y = 1; } 
    let value2 = { x = 1; y = 1; } 
    let result2 = value1 >< value2
    result2 @>      
print (quote.EvalUntyped()) 

標準演算子への誤った呼び出しを生成する代わりに=、カスタム演算子を呼び出すコードが生成されるため(標準の正しくコンパイルされたF#コードとして比較が実行されます)、期待どおりの結果が得られます。

于 2010-02-26T21:08:06.837 に答える