2010-02-26 8 views
4

У меня проблема с оценкой котировок F # Powerpack.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()) 

Первый результат верен, как и следовало ожидать. Вторая ложь. Это ошибка, или я чего-то не хватает?

+0

FYI - Я просто попробовал это, и похоже, что это исправлено в последнем PowerPack –

ответ

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 #), поэтому это дает ожидаемый результат.

+0

Где я могу сообщить об этой ошибке? Мне нравится ваше обходное решение, хотя оно, к сожалению, не будет работать в моей ситуации. – justin

+0

Брайан (http://stackoverflow.com/users/19299/brian) из команды F # является активным пользователем/наркоматом StackOverflow :-), поэтому ваше сообщение здесь, вероятно, достаточно, но вы также можете сообщить об ошибках F # в 'fsbugs (at) microsoft (dot) com'. –

+0

Для ошибок в powerpack, сообщите об этом на веб-сайте powerpack: http://fsharppowerpack.codeplex.com/WorkItem/List.aspx – Brian