Вопрос оценки котировки F # - PullRequest
4 голосов
/ 26 февраля 2010

У меня проблема с оценкой предложения 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 Ответ

7 голосов
/ 27 февраля 2010

Это похоже на ошибку для меня. Кто-то из команды 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 #), так что это дает ожидаемый результат.

...