【发布时间】:2014-10-20 17:53:12
【问题描述】:
首先,我想澄清一下,我试图找到解决我在谷歌上搜索问题的方法,但我没有成功。
我需要一种方法来比较两个表达式。问题是这些表达方式没有可比性。我来自 Erlang,我可以在那里做:
case exp1 of
exp2 -> ...
exp1 和 exp2 绑定的位置。但是 Haskell 不允许我这样做。但是,在 Haskell 中,我可以使用 == 进行比较。不幸的是,他们的类型不是Eq 类的成员。当然,这两个表达式直到运行时都是未知的,所以我不能在源代码中编写静态模式。
如何在不必定义我自己的比较函数的情况下比较这两个表达式?我想可以以某种方式在这里使用模式匹配(如在 Erlang 中),但我不知道如何。
编辑
我认为解释我的目标有助于理解问题。
我正在修改抽象语法树 (AST)。我将应用一组将修改此 AST 的规则,但我想将修改存储在一个列表中。这个列表的元素应该是一个元组,其中包含 AST 的原始部分及其修改。所以最后一步是为每个元组搜索一个完全相同的 AST,并将其替换为元组的第二个元素。所以,我需要这样的东西:
change (old,new):t piece_of_ast =
case piece_of_ast of
old -> new
_ -> piece_of_ast
我希望这个解释能澄清我的问题。
提前致谢
【问题讨论】:
-
是什么阻止您定义
Eq实例? -
我没有定义这些类型。它们在库中定义。独立它们有很多构造函数和子类型等。
-
有点不清楚你在做什么。如果可以使用模式匹配,则不一定需要
Eq实例。你能举一个更具体的例子吗? -
@bheklilr 我希望现在有了这个解释,您可以更好地理解我的问题。
-
@SalvadorTamarit 如果它是开源的,您能否提供指向该库的链接?如果只是有大量的构造函数,但没有什么能阻止你检查语法相等(例如 HOAS),那么真的应该有一个
deriving Eq
标签: haskell pattern-matching expression comparable