模式匹配Haskell中的等效变量,就像在Prolog中一样

时间:2010-11-04 00:38:00

标签: haskell syntax prolog pattern-matching unification

在prolog中,我们可以执行以下操作:

myFunction a (a:xs) = ...

这是,当myFunction的第一个参数与第二个参数中列表的第一个项相同时,此函数将评估为...

我现在的问题是......如何在Haskell中完成类似的事情? 我认为Prolog的模式匹配比Haskell更具表现力。我一直在尝试在Haskell中编写代码并且我遇到了麻烦 - 要么我使用了无效的语法,要么上面的技巧根本就没用。

3 个答案:

答案 0 :(得分:13)

Haskell不会做这种“变量匹配”。你必须明确地保护:

myFunction a (x:xs)
    | x == a = ...

答案 1 :(得分:12)

Haskell没有像Prolog那样进行变量的统一。正如Haskell 98 report所说,

  

每个匹配对应的模式集必须是线性的 - 不允许变量在整个集合中出现多次。

您当然可以命名变量,并声明它们也必须相等:

f a (b:_) | a == b = ...

有趣的是,Agda确实让信息流过这样的模式,并引入了一个特殊的符号f x (.x:_)来说明x必须是x

答案 2 :(得分:8)

在Haskell中,你不能在模式匹配中进行这样的隐式比较。相反,你需要添加一个明确进行比较的守卫,如下所示:

myFunction a (b:xs) | a == b = ...