Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
Haskell 为什么这是一种非穷举搜索模式?_Haskell_Recursion - Fatal编程技术网

Haskell 为什么这是一种非穷举搜索模式?

Haskell 为什么这是一种非穷举搜索模式?,haskell,recursion,Haskell,Recursion,为什么这是非详尽的,删除一个元素不意味着它最终应该停止吗 do_something :: [(String, String, Int)] -> String do_something [(a, b, c)] = func(a, b, c) ++ do_something( drop 1 [(a, b, c)]) 您必须在dou\u something声明中指定(String,String,Int)列表的每个大小写。您必须给出传递给do\u something的参数为空或包含多个元素时的定

为什么这是非详尽的,删除一个元素不意味着它最终应该停止吗

do_something :: [(String, String, Int)] -> String
do_something [(a, b, c)] = func(a, b, c) ++ do_something( drop 1 [(a, b, c)])

您必须在
dou\u something
声明中指定
(String,String,Int)
列表的每个大小写。您必须给出传递给
do\u something
的参数为空或包含多个元素时的定义。当您没有指定这些情况时,编译器不知道自动执行什么操作

另一种方法是,函数声明中的模式匹配与使用case语句相同:

do_something :: [(String, String, Int)] -> String
do_something xs = case xs where
    [(a, b, c)] -> func (a, b, c) ++ do_something (drop 1 [(a, b, c)])
    -- What about the other cases?
    -- otherwise -> ???
此外,在这种情况下,最好将函数指定为

do_something (x:xs) = func x ++ do_something xs
do_something [] = ???
因为这实际上是递归地定义函数。表达式
drop 1[(a,b,c)]
与只写
[]
相同,因此您当前的定义相当于

do_something [(a, b, c)] = func (a, b, c) ++ do_something []

事实上,他只给出了一个元素的情况——与你在这里所说的完全相反。@DanielWagner哎呀,在我的脑海中,它是“你必须给出定义…”然后
do\u something
开始看起来像
concatMap func
@raymonad它看起来确实是这样的,但也可能是OP希望在
do\u something[]
上有其他行为。因为没有具体说明,所以我把它留了下来。