4

我遇到了 F# powerpack 报价评估的问题。

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())

如您所料,第一个结果是正确的。第二个是假的。这是一个错误,还是我错过了什么?

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 回答