而不是使用 sum [1,2,3],这是一个内置库,如何以递归方式在数组中添加数字? 这是我认为我应该使用的代码,但是我收到以下错误:
sumThem (x:xs) = x + sumThem xs
这就是我从终端窗口调用它的方式:
sumThem [1,2,3]
这是错误
Exception: jan31.hs:21:1-25: Non-exhaustive patterns in function sumThem
答案 0 :(得分:1)
您编写的代码是:
sumThem :: Num a => [a] -> a
sumThem (x:xs) = x + sumThem xs
这匹配所有非空列表(因为它们在(x:xs)
上进行模式匹配),但看看当我们跟随递归时会发生什么:
sumThem [1,2,3]
-> 1 + sumThem [2,3]
-> 1 + 2 + sumThem [3]
-> 1 + 2 + 3 + sumThem []
哦,哦,现在哈斯克尔不知道该怎么做。您还没有为递归函数定义基本情况,因此它不知道何时结束。在这种情况下,通过无法对空列表进行模式匹配来实现。要写出基本案例,想象一下对问题的合理答案"什么是一组空数字的总和?"
sumThem :: Num a => [a] -> a
sumThem (x:xs) = x + sumThem xs
sumThem [] = 0
现在你的递归看起来像:
sumThem [1,2,3]
-> 1 + sumThem [2,3]
-> 1 + 2 + sumThem [3]
-> 1 + 2 + 3 + sumThem []
-> 1 + 2 + 3 + 0
= 6