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[]
上有其他行为。因为没有具体说明,所以我把它留了下来。