Haskell中Ints列表列表的第二和第三个元素的总和?

时间:2014-12-01 00:14:43

标签: haskell

我正在尝试编写一个函数,它将Ints列表列表作为输入,并返回一个Int列表,如果列表包含至少3个元素,则包含每个列表的第二个和第三个元素的总和。

我得到的错误与我所拥有的非详尽模式有关,我不知道为什么。

sumSecondThird :: [[Int]] -> [Int]
sumSecondThird [] = []
sumSecondThird ((_:x:y:_):xs) = (x+y):(sumSecondThird xs)

我可以使用!!函数使其工作,但我想使用模式匹配。有关为什么不起作用的任何帮助?

2 个答案:

答案 0 :(得分:1)

使用-Wall进行编译是一个好主意,因为它通常可以揭示潜在的错误来源:

Warning:
    Pattern match(es) are non-exhaustive
    In an equation for ‘sumSecondThird’:
        Patterns not matched:
            [] : _
            [_] : _
            [_, _] : _

您的模式匹配仍然缺少几种可能性,因此只要sumSecondThird遇到它们,它就会因运行时错误而失败。

要修复解决方案,您需要处理这些缺失模式的情况。由于这些模式仅在列表短于3个元素时出现,因此您可以忽略它们并继续前进:

sumSecondThird :: [[Int]] -> [Int]
sumSecondThird [] = []
sumSecondThird ((_:x:y:_):xs) = (x+y):(sumSecondThird xs)
sumSecondThird (_:xs) = sumSecondThird xs

答案 1 :(得分:0)

sumSecondThird :: [[Int]] -> [Int]
sumSecondThird = foldr go [] where
  go (_:x:y:_) r = x + y : r
  go _         r = r