如何在Haskell中递归获取数组元素的总和?

时间:2018-02-01 16:44:21

标签: haskell recursion

而不是使用 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

1 个答案:

答案 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