9

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

myFunction a (a:xs) = ...

也就是说,当 的第一个参数myFunction与第二个参数中的列表的第一项相同时,此函数的计算结果为...

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

4

3 回答 3

13

Haskell 不做这种“变量匹配”。你必须明确地把警卫放在:

myFunction a (x:xs)
    | x == a = ...
于 2010-11-04T00:39:46.223 回答
12

Haskell 不像Prolog 那样统一变量。正如Haskell 98 报告所说,

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

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

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

有趣的是,Agda 确实让信息在这样的模式中流动,并引入了一个特殊的符号f x (.x:_)来表示 this xmust be that x

于 2011-05-07T03:00:19.850 回答
8

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

myFunction a (b:xs) | a == b = ...
于 2010-11-04T00:39:52.577 回答