2017-10-17 85 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]