我正在尝试实现一个对两个列表的内容求和的函数。这是我的代码:
sum'' :: Num a => [a] -> [a] -> [a]
sum'' [] [] = []
sum'' (x:xs) (y:ys) = (x + y) : sum'' xs ys
如果我输入:
sum'' [1,2,3] [4,5,6]
我得到[5,7,9]
,这就是我想要的。我遇到的问题是不同的列表大小。如果我输入:
sum'' [] [1,2,3]
我希望它返回[]
。或
sum'' [1,2] [4,5,6]
我希望它返回[5,7]
。我收到此错误但不知道原因:Non-exhaustive patterns in function sum''
。
非常感谢任何帮助。
答案 0 :(得分:4)
定义sum''
时,您已经为两个空列表和两个非空列表定义了它的含义,但是您还没有定义它对两个列表的含义,其中只有一个是空的。这是编译器通过该错误消息告诉您的内容。
只要添加sum''
的定义,只要左侧列表为空且右侧列表不为,则反之亦然:
sum'' (x:xs) [] = ...
sum'' [] (y:ys) = ...
答案 1 :(得分:0)
在Haskell中,实际上对于你需要的是ZipList
类型,您可以使用它来执行以下操作;
import Control.Applicative
addLists :: Num a => [a] -> [a] -> [a]
addLists xs ys = getZipList $ (+) <$> ZipList xs <*> ZipList ys
*Main> addLists [3] [1,2,3]
[4]