在 prolog 中,我们可以执行以下操作:
myFunction a (a:xs) = ...
也就是说,当 的第一个参数myFunction
与第二个参数中的列表的第一项相同时,此函数的计算结果为...
。
我现在的问题是......如何在 Haskell 中完成类似的事情?我认为 Prolog 的模式匹配比 Haskell 的更具表现力。我一直在尝试在 Haskell 中编写代码,但遇到了麻烦——要么我使用了无效的语法,要么上述技巧根本行不通。
在 prolog 中,我们可以执行以下操作:
myFunction a (a:xs) = ...
也就是说,当 的第一个参数myFunction
与第二个参数中的列表的第一项相同时,此函数的计算结果为...
。
我现在的问题是......如何在 Haskell 中完成类似的事情?我认为 Prolog 的模式匹配比 Haskell 的更具表现力。我一直在尝试在 Haskell 中编写代码,但遇到了麻烦——要么我使用了无效的语法,要么上述技巧根本行不通。
Haskell 不做这种“变量匹配”。你必须明确地把警卫放在:
myFunction a (x:xs)
| x == a = ...
Haskell 不像Prolog 那样统一变量。正如Haskell 98 报告所说,
每个匹配对应的模式集合必须是线性的——在整个集合中不允许变量出现超过一次。
您当然可以命名变量,并声明它们也必须相等:
f a (b:_) | a == b = ...
有趣的是,Agda 确实让信息在这样的模式中流动,并引入了一个特殊的符号f x (.x:_)
来表示 this x
must be that x
。
在 Haskell 中,您不能在模式匹配中进行这样的隐式比较。相反,您需要添加一个明确进行比较的守卫,如下所示:
myFunction a (b:xs) | a == b = ...