在OCaml中忽略关于=的某些类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在OCaml中忽略关于=的某些类型相关的知识,希望对你有一定的参考价值。
我正在修改用OCaml编写的现有编译器。我已经在编译语言的AST中添加了位置,但它导致了一堆错误,因为当相同的AST具有不同的附加位置时,先前成功的相等检查现在会失败。
特别是,我看到List.mem
在它应该返回true时返回false,因为它依赖于相等性。
我想知道,有没有办法让我指定,对于我的位置类型的任何两个值,=
应该总是为这种类型的任何两个值返回true?
重构整个编译器以在任何地方使用自定义相等将是一项繁重的工作,特别是因为许多多态函数依赖于能够在任何类型上使用=。
没有现成的OCaml机制可以做你想要的。
您可以使用ppx编写OCaml语法扩展,并且(据我所知),行为可能取决于类型。所以你有可能让事情按照这种方式运作。但它并不像你所要求的那样简单。我怀疑你需要明确处理=
和任何隐式使用List.mem
的标准函数(如=
)。 (请注意,我没有使用ppx的经验。)
我在这里找到了PPX的描述:http://ocamllabs.io/doc/ppx.html
许多有经验的OCaml程序员避免使用内置的多态相等,因为它的行为通常令人惊讶。因此,毕竟可能值得转换为自定义比较功能。
这是多么烦人的问题。
如果您绝望并愿意编写一些C代码,您可以将位置的表示更改为Custom_tag
块,这样可以自定义某些多态操作的行为。这是一个讨厌的解决方案,我建议你在诉诸这个之前先努力寻找更好的方法。
一种可能性是大多数编译器根本不使用位置。如果是这样,您可能可以使用相同的虚拟位置替换AST中的每个位置。这应该允许平等表现为好像根本不存在位置。这是相当hacky,如果稍后在编译器中传递使用位置信息,则可能无法实现。
“干净”的解决方案是为AST定义一个理智的相等操作(或使用ppx
派生一个)并更改代码以使用它。正如你所说,这将是更多的工作。
以上是关于在OCaml中忽略关于=的某些类型的主要内容,如果未能解决你的问题,请参考以下文章