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