我正在尝试编写一个函数,它将Ints列表列表作为输入,并返回一个Int列表,如果列表包含至少3个元素,则包含每个列表的第二个和第三个元素的总和。
我得到的错误与我所拥有的非详尽模式有关,我不知道为什么。
sumSecondThird :: [[Int]] -> [Int]
sumSecondThird [] = []
sumSecondThird ((_:x:y:_):xs) = (x+y):(sumSecondThird xs)
我可以使用!!
函数使其工作,但我想使用模式匹配。有关为什么不起作用的任何帮助?
答案 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