dev*_*ium 9 syntax haskell prolog pattern-matching unification
在prolog中,我们可以执行以下操作:
myFunction a (a:xs) = ...
Run Code Online (Sandbox Code Playgroud)
这是,当第一个参数myFunction与第二个参数中列表的第一个项相同时,此函数将评估为....
我现在的问题是......如何在Haskell中完成类似的事情?我认为Prolog的模式匹配比Haskell更具表现力.我一直在尝试在Haskell中编写代码并且我遇到了麻烦 - 要么我使用了无效的语法,要么上面的技巧根本就没有.
por*_*ges 13
Haskell不会做这种"变量匹配".你必须明确地保护:
myFunction a (x:xs)
| x == a = ...
Run Code Online (Sandbox Code Playgroud)
Don*_*art 12
正如Prolog所做的那样,Haskell没有统一变量.正如Haskell 98报告所说,
对应于每个匹配的模式集必须是线性的 - 不允许变量在整个集合中出现多次.
您当然可以命名变量,并声明它们也必须相等:
f a (b:_) | a == b = ...
Run Code Online (Sandbox Code Playgroud)
有趣的是,阿格达不会让这样的跨模式的信息流,并介绍了一个特殊的符号f x (.x:_),这不能不说x必须是x.
在Haskell中,你不能在模式匹配中进行这样的隐式比较.相反,你需要添加一个明确进行比较的守卫,如下所示:
myFunction a (b:xs) | a == b = ...
Run Code Online (Sandbox Code Playgroud)