在prolog中,我们可以执行以下操作:
myFunction a (a:xs) = ...
这是,当myFunction
的第一个参数与第二个参数中列表的第一个项相同时,此函数将评估为...
。
我现在的问题是......如何在Haskell中完成类似的事情? 我认为Prolog的模式匹配比Haskell更具表现力。我一直在尝试在Haskell中编写代码并且我遇到了麻烦 - 要么我使用了无效的语法,要么上面的技巧根本就没用。
答案 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 = ...