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

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.


Tom*_*ett 8

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

myFunction a (b:xs) | a == b = ...
Run Code Online (Sandbox Code Playgroud)