以下打印" false"
let e1 = <@@ let d = 1 in d+1 @@>
let e2 = <@@ let d = 1 in d+1 @@>
printfn "%A" (e1 = e2)
原因是Var节点通过指针引用而不是结构相等进行比较。 是否已经实现了直观地比较报价的方法?
答案 0 :(得分:8)
有很多原因可以解释为什么比较报价没有&#34;工作&#34;默认情况下:
(fun x -> x)
和(fun y -> y)
视为相同的问题 - 从逻辑上讲,它们是,但从语法上讲,它们不是。因此,如果您想检查报价是否相等,您只需要实施自己的检查。像这样的东西可以解释你在示例中的基本情况,但它不能处理所有情况:
open Microsoft.FSharp.Quotations
open Microsoft.FSharp.Quotations.Patterns
let rec equal = function
| Let(v1, ea1, eb1), Let(v2, ea2, eb2) ->
v1.Name = v2.Name && equal (ea1, ea2) && equal (eb1, eb2)
| Var(v1), Var(v2) -> v1.Name = v2.Name
| Lambda(v1, e1), Lambda(v2, e2) -> v1.Name = v2.Name && equal (e1, e2)
| Call(None, m1, es1), Call(None, m2, es2) ->
m1 = m2 && (List.zip es1 es2 |> List.forall equal)
| Value(v1), Value(v2) -> v1 = v2
| _ -> false