F#报价评估问题

时间:2010-02-26 20:59:34

标签: f# quotations

我遇到了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())

第一个结果如你所料那样真实。第二个是假的。这是一个错误,还是我错过了什么?

1 个答案:

答案 0 :(得分: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#代码运行),这样就可以得到预期的结果