为什么模式匹配不包括Haskell中的列表头?

时间:2013-07-29 15:34:33

标签: list haskell pattern-matching

我想在Haskell中使用以下代码/功能:

test :: String -> String -> Bool
test (x:xs) (x:ys) = True
test _        _    = False

这应检查两个列表是否以完全相同的元素开头 但这不起作用。
我的编译器说:Conflicting definitions for x

我认为像这样匹配的模式必须使用函数式语言。我之前和Prolog一起工作过,我很确定它在那里工作:/

这是不是在Haskell中实现的还是我的语法错了?

2 个答案:

答案 0 :(得分:6)

你可能想要这样的东西。

test :: String -> String -> Bool
test (x:xs) (y:ys) = x == y
test _        _    = False

正如@TikhonJelvis注意到的那样,haskell不是Prolog,所以你无法检查模式匹配中变量的相等性。

答案 1 :(得分:3)

模式匹配不统一变量。

test :: String -> String -> Bool
test (x:xs) (y:ys) = x == y
test _        _    = False

所以你可以分别测试每个变量的相等性,如上所述。