Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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
Function 为什么我的守卫不想在Haskell中调用递归函数_Function_Haskell_Call - Fatal编程技术网

Function 为什么我的守卫不想在Haskell中调用递归函数

Function 为什么我的守卫不想在Haskell中调用递归函数,function,haskell,call,Function,Haskell,Call,我正在尝试调用Haskell程序中的do recursive。每当列表中的元素与单词匹配时,我都要调用我的函数 我的代码编译没有问题,但当我试图执行他的时候,我有这个eror haskell: haskell.hs:(27,1)-(30,33): Non-exhaustive patterns in function detect 问题所在的我的职能部门: detect :: [[Char]] -> [[Char]] -> [[Char]] detect (x:xs) b

我正在尝试调用Haskell程序中的do recursive。每当列表中的元素与单词匹配时,我都要调用我的函数

我的代码编译没有问题,但当我试图执行他的时候,我有这个eror

haskell: haskell.hs:(27,1)-(30,33): Non-exhaustive patterns in function detect
问题所在的我的职能部门:

detect :: [[Char]] -> [[Char]] -> [[Char]]
detect (x:xs) b
         | x == "now" || x == "go" = detect xs (SwapP 0 1 b)
         | x == "stop" = detect xs (SwapP 0 (length b - 1) b)
detect (x:xs) b = detect xs b
在x:xs中有我的单词列表,在b中,我有一个函数,其任务是改变单词的位置

但是警卫中的递归程序不起作用

我的问题中最奇怪的是,当我试图做同样的事情,但在我的守卫之外,如果我做了,它就起作用了

  detect :: [[Char]] -> [[Char]] -> [[Char]]
   detect (x:xs) b = detect xs (SwapP 0 (length b - 1) b)
它起作用了,我的第一句话和最后一句话都在变


所以,如果有人对这个问题有想法,你可以给他一个小信息。谢谢。

基本上,我的问题是我的xs列表。我递归地读取所有列表并删除元素。最后,我的列表没有元素,但我的函数仍在尝试删除和检查内容。为了解决这个问题,我添加了一个简单的

compares [] b = b

问题在于您的函数比较,而不是检测。也就是说,detect函数不包括空列表[]。@NatkoUndoshy一个列表要么是空列表,要么由另一个列表前面的元素组成。这是一个递归定义,因此即使是非空的有限列表也必须由一系列元素组成,这些元素被预先添加到空列表中。您应该在线查看一些资源,了解Haskell中的ADT是如何工作的,以及如何使用模式匹配来定义递归函数,这将有助于澄清detect x:xs b=detect xs b的问题,最终,xs将是未处理的空列表。您可以回答自己的问题。编译时始终显示警告。GHC确实在编译时发现了这个问题。