在OCaml中忽略关于=的某些类型

问题描述 投票:1回答:2

我正在修改用OCaml编写的现有编译器。我已经在编译语言的AST中添加了位置,但它导致了一堆错误,因为当相同的AST具有不同的附加位置时,先前成功的相等检查现在会失败。

特别是,我看到List.mem在它应该返回true时返回false,因为它依赖于相等性。

我想知道,有没有办法让我指定,对于我的位置类型的任何两个值,=应该总是为这种类型的任何两个值返回true?

重构整个编译器以在任何地方使用自定义相等将是一项繁重的工作,特别是因为许多多态函数依赖于能够在任何类型上使用=。

functional-programming polymorphism ocaml equality ml
2个回答
2
投票

没有现成的OCaml机制可以做你想要的。

您可以使用ppx编写OCaml语法扩展,并且(据我所知),行为可能取决于类型。所以你有可能让事情按照这种方式运作。但它并不像你所要求的那样简单。我怀疑你需要明确处理=和任何隐式使用List.mem的标准函数(如=)。 (请注意,我没有使用ppx的经验。)

我在这里找到了PPX的描述:http://ocamllabs.io/doc/ppx.html

许多有经验的OCaml程序员避免使用内置的多态相等,因为它的行为通常令人惊讶。因此,毕竟可能值得转换为自定义比较功能。


1
投票

这是多么烦人的问题。

如果您绝望并愿意编写一些C代码,您可以将位置的表示更改为Custom_tag块,这样可以自定义某些多态操作的行为。这是一个讨厌的解决方案,我建议你在诉诸这个之前先努力寻找更好的方法。

一种可能性是大多数编译器根本不使用位置。如果是这样,您可能可以使用相同的虚拟位置替换AST中的每个位置。这应该允许平等表现为好像根本不存在位置。这是相当hacky,如果稍后在编译器中传递使用位置信息,则可能无法实现。

“干净”的解决方案是为AST定义一个理智的相等操作(或使用ppx派生一个)并更改代码以使用它。正如你所说,这将是更多的工作。

© www.soinside.com 2019 - 2024. All rights reserved.