Haskell中的模式匹配等价变量,如Prolog中的

Haskell中的模式匹配等价变量,如Prolog中的,haskell,syntax,prolog,pattern-matching,unification,Haskell,Syntax,Prolog,Pattern Matching,Unification,在prolog中,我们可以执行以下操作: myFunction a (a:xs) = ... 也就是说,当myFunction的第一个参数与第二个参数中列表的第一项相同时,此函数将计算为… 我现在的问题是。。。如何在Haskell中完成类似的事情? 我认为Prolog的模式匹配比Haskell的更具表现力。我一直在尝试用Haskell编写代码,但我遇到了麻烦——要么我使用了无效的语法,要么上述技巧根本不起作用。Haskell不做这种“变量匹配”。您必须明确地对以下各项进行防范: myFunct

在prolog中,我们可以执行以下操作:

myFunction a (a:xs) = ...
也就是说,当
myFunction
的第一个参数与第二个参数中列表的第一项相同时,此函数将计算为

我现在的问题是。。。如何在Haskell中完成类似的事情?
我认为Prolog的模式匹配比Haskell的更具表现力。我一直在尝试用Haskell编写代码,但我遇到了麻烦——要么我使用了无效的语法,要么上述技巧根本不起作用。

Haskell不做这种“变量匹配”。您必须明确地对以下各项进行防范:

myFunction a (x:xs)
    | x == a = ...

在Haskell中,不能在模式匹配中进行这样的隐式比较。相反,您需要添加一个明确执行比较的保护,如下所示:

myFunction a (b:xs) | a == b = ...
Haskell不像Prolog那样统一变量。正如《圣经》所说

与每个匹配对应的模式集必须是线性的——不允许任何变量在整个集合中出现一次以上

当然,您可以命名变量,并声明它们也必须相等:

f a (b:_) | a == b = ...


有趣的是,Agda确实允许信息在这样的模式间流动,并引入了一种特殊的符号
fx(.x:)
,表示
x
必须是
x

,在scala中,您也可以使用
x
来表示与变量值匹配的模式,如Agda情况。