Haskell递归列表求和

时间:2016-01-15 18:11:58

标签: list haskell recursion

我是函数式编程和haskell的新手,所以我只是通过尝试一些Euler问题开始学习。这涉及大量的列表总结。

所以我试图写一个递归列表求和函数,它将一个列表作为输入并返回一个整数作为输出,例如:

-- Sum up a list
listsum :: [int] -> int
listsum [a:b:[]] = a + b
listsum x = head x + listsum tail x

编译此代码时,我收到此错误:

Couldn't match expected type `[[int] -> int]'
            with actual type `[a0] -> [a0]'
Relevant bindings include
  x :: [int]
    (bound at C:\Users\Rade\Documents\GitHub\haskell\euler_2.hs:15:9)
  listsum :: [int] -> int
    (bound at C:\Users\Rade\Documents\GitHub\haskell\euler_2.hs:14:1)
Probable cause: `tail' is applied to too few arguments
In the first argument of `listsum', namely `tail'
In the second argument of `(+)', namely `listsum tail x'

我试图研究模式匹配,但我无法理解预期类型与实际类型的含义。我哪里错了?

1 个答案:

答案 0 :(得分:5)

listsum [a:b:[]] = a + b

此处,a:b:[]表示列表[a, b],因此[a:b:[]]表示[[a, b]],这不是您想要的。

只需将其更改为

即可
listsum (a:b:[]) = a + b

现在,在

listsum x = head x + listsum tail x

部分listsum tail x表示listsum应用于tail,然后将结果应用于x 。我想你的意思是tail应用于x,然后将listsum应用于结果,可以表示为listsum (tail x)

我建议使用更清洁的实现,假设将空列表求和为零。

listsum [] = 0
listsum (x:t) = x + listsum t

这与您的实现的功能不同,因为它正确处理零或一个元素的列表。