Functional programming 忽略OCaml中与=相关的某些类型
我正在修改用OCaml编写的现有编译器。我已经在编译语言的AST中添加了位置,但这会导致一系列错误,因为当相同的AST附加了不同的位置时,以前成功的相等性检查现在会失败 特别是,我看到Functional programming 忽略OCaml中与=相关的某些类型,functional-programming,polymorphism,ocaml,equality,ml,Functional Programming,Polymorphism,Ocaml,Equality,Ml,我正在修改用OCaml编写的现有编译器。我已经在编译语言的AST中添加了位置,但这会导致一系列错误,因为当相同的AST附加了不同的位置时,以前成功的相等性检查现在会失败 特别是,我看到List.mem在应该返回true时返回false,因为它依赖于等式 我想知道,对于我位置类型的任意两个值,=对于该类型的任意两个值,是否有一种方法可以指定它应该始终返回true 重构整个编译器以在任何地方都使用自定义等式将是一项艰巨的工作,特别是因为许多多态函数依赖于能够在任何类型上使用=。没有现有的OCaml机
List.mem
在应该返回true时返回false,因为它依赖于等式
我想知道,对于我位置类型的任意两个值,=
对于该类型的任意两个值,是否有一种方法可以指定它应该始终返回true
重构整个编译器以在任何地方都使用自定义等式将是一项艰巨的工作,特别是因为许多多态函数依赖于能够在任何类型上使用=。没有现有的OCaml机制来实现您想要的功能 您可以使用ppx编写OCaml语法扩展,而且(据我所知)行为可能取决于类型。所以,你有机会让事情以这种方式运作。但这并不像你要求的那样简单。我怀疑您需要显式地处理
=
和隐式使用=
的任何标准函数(如List.mem
)。(请注意,我没有ppx方面的经验。)
我在这里找到了PPX的描述:
许多经验丰富的OCaml程序员避免使用内置多态相等,因为它的行为常常令人惊讶。因此,它可能值得转换为自定义比较函数。这是一个多么烦人的问题 如果您非常渴望并愿意编写一点C代码,您可以将位置的表示形式更改为
Custom_tag
块,这允许自定义一些多态操作的行为。这是一个令人讨厌的解决方案,我建议你在使用这个方法之前,努力寻找更好的方法
一种可能性是大多数编译器根本不使用位置。如果是这样的话,您可以用相同的虚拟位置替换AST中的每个位置。这应该允许平等行为,就好像根本不存在位置一样。这是一个相当粗糙的过程,如果编译器中稍后的过程使用了任何位置信息,那么这可能是不可能的
“干净”的解决方案是为AST定义一个合理的相等操作(或使用ppx
)并更改代码以使用该操作。正如你所说,这将是更多的工作