添加两个不同大小列表的内容haskell

时间:2017-10-17 04:09:52

标签: list haskell functional-programming pattern-matching

我正在尝试实现一个对两个列表的内容求和的函数。这是我的代码:

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''

非常感谢任何帮助。

2 个答案:

答案 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]