gpt4 book ai didi

F# 比较引号

转载 作者:行者123 更新时间:2023-12-03 09:49:06 25 4
gpt4 key购买 nike

以下打印“假”

let e1 = <@@ let d = 1 in d+1 @@>
let e2 = <@@ let d = 1 in d+1 @@>

printfn "%A" (e1 = e2)

原因是 Var 节点是通过指针引用而不是结构相等来比较的。
是否已经实现了一种直观地比较报价的方法?

最佳答案

默认情况下比较报价不起作用的原因有很多:

  • 引用可以包含对可能未定义比较的值的引用(例如,如果您创建一个引用来捕获某些不支持比较的 .NET 对象)。
  • 引文包含有关源代码中位置的信息 - 因此您的两个引文之所以不同,仅仅是因为它们位于不同的行上!
  • 有问题要不要治疗(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

    关于F# 比较引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23268556/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com