Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 为什么模式匹配不包括Haskell中的列表头?_List_Haskell_Pattern Matching - Fatal编程技术网

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

List 为什么模式匹配不包括Haskell中的列表头?,list,haskell,pattern-matching,List,Haskell,Pattern Matching,我想在Haskell中使用以下代码/功能: test :: String -> String -> Bool test (x:xs) (x:ys) = True test _ _ = False 这应该检查两个列表是否以完全相同的元素开头。 但这不起作用。 我的编译器说:x的定义冲突 我认为这样的模式匹配必须在函数式语言中工作。我之前刚使用过Prolog,我很确定它在那里也能工作:/ 这不是在Haskell中实现的,还是我的语法错了?您可能想要这样的东西 tes

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

test :: String -> String -> Bool
test (x:xs) (x:ys) = True
test _        _    = False
这应该检查两个列表是否以完全相同的元素开头。
但这不起作用。
我的编译器说:
x的定义冲突

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


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

您可能想要这样的东西

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

正如@TikhonJelvis所注意到的,
haskell
不是一个
Prolog
,因此您无法检查模式匹配中变量的相等性。

模式匹配没有统一变量

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

因此,您可以单独测试每个变量是否相等,如上所述。

当列表包含不可比较的项(例如函数)时,会出现隐式比较问题。允许这种隐式比较(可能)会使语法不那么清晰。虽然有一件奇怪的事,就是匹配数字常数,它使用积分和比较。