2017-10-17 100 views
2

我想实现一个函数来总结两个列表的内容。这里是我的代码:添加两个不同大小的列表haskell的内容

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

使用'-Wall'标志打开警告会使GHC在编译时警告错过的情况。推荐的。 – chi

回答

4

定义sum''时,您已经定义了两个空列表和两个非空列表的含义,但您尚未定义两个列表的含义,其中只有一个为空。这是编译器通过错误消息告诉你的。

只需添加的定义是什么sum''意味着每当左侧列表是空的,正确的不在列表中,反之亦然:

sum'' (x:xs) [] = ... 
sum'' [] (y:ys) = ... 
+2

而且,作为一个可爱的把戏,你可以考虑'sum''(x:xs)(y:ys)= ...; sum _ _ = ...'如果你的'[] []','(x:xs)[]'和'[](y:ys)]'子句都返回相同的结果。 –

+0

@Fyodor Soikin感谢您的帮助,但我仍然困惑,问题的第二部分如何。总和''[1,2] [4,5,6]只返回[5,7]并将第二个列表中的6删除 – legoniko

+0

@DanielWagner您是否碰巧知道问题的第二部分如何?总和''[1,2] [4,5,6]只返回[5,7],并将第二个列表中的6删除。不字面上做,但任何指导表示赞赏。我试过这样做:sum _ _ = ...如果你的[] [],(x:xs)[]和[](y:ys)],但它只给了我一个错误。所有的条款都返回相同的东西。 – legoniko

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] 
相关问题