假设想要一个函数,获取一个数字列表,它返回相邻数字对的总和,除了两条边,它只返回边号。例如:
[1,2,3,4,5] --> [1,3,5,7,9,5]
我想出了以下功能:
p1 :: Num a => [a] -> [a]
p1 [] = []
p1 (x:xs) = x:p2 (x:xs)
p2 :: Num a => [a] -> [a]
p2 [x] = [x]
p2 (x1:x2:xs) = (x1+x2):p2 (x2:xs)
(没关系是否有更好的方法来做到这一点......)
p2
只被p1
. p2
也永远不会用空列表调用,只有列表至少有一个元素。但是,p2
它仍然是一个部分功能,它会触发一个非详尽的模式匹配警告ghc -Wall
。
处理这个问题的公认方法是什么?我只是不写p2 []
案例吗?或者p2 [] = undefined
,或者p2 [] = unused_value
,或者别的什么?