2017-02-14 55 views
0

我想要做的就是總結列表清單。我想要的例子做:總結列表清單時出現「非窮舉模式」錯誤

輸入[[1,2,3],[2,5],[6,7]]

輸出[6,7,13]

名單外列表內的量能變化,以及整數的每個內部列表量可以變化。我試過千頭萬緒,這是最後一個我試過,但它不工作:

sumSubsets [[x]] = map sum [[x]] 

另外,我想sumSubsets [] = [[]]的基本情況,但導致的錯誤也是如此。任何幫助,將不勝感激。

+0

'地圖sum'應該是足夠了... – Alec

+0

A-了頭:我已經改變了標題,以更好地反映潛在的問題,並提錯誤,(我假設)你看到了。 (在這種情況下,引用你得到的錯誤總是一個好主意。) – duplode

回答

2

你可以使用

sumSubsets x = map sum x 

甚至

sumSubsets = map sum 

你以前的代碼,

sumSubsets [[x]] = map sum [[x]] 

首先執行使用它匹配包含一個列表[[x]]一個模式匹配元素,這本身就是一個包含單個元素的列表。因此,將在[[3]]

>> sumSubsets [[3]] 
[3] 

但無法正常運作。[[1,2,3]][[1],[2]]

+0

Woooow,好吧,我簡直不敢相信方括號是搞亂了它。我知道這個概念是正確的。好。謝謝。 雖然問題,爲什麼只是x的作品,但[x]或[[x]]不是? – MandyLB

+1

'[[x]]'是包含一個列表的列表模式,就像'[x]'是一個只包含一個元素的列表一樣。只是'x'是任何形狀的任何輸入 –

+0

另一個問題。代碼是否需要改變,以輸出[[6],[7],[13]]而不是[6,7,13]? – MandyLB

0

我認爲你的問題主要來自混合類型和值,這可能容易發生在初學者,特別是列表中。整個混淆可能來自這樣的事實:在Haskell中,[]被用作數據構造函數以及類型構造函數。

例如,[Int]表示「Ints列表」(一種類型),但[1]表示「包含一個元素的列表,即數字1」(一個值 - 意思是整個列表是值) 。這兩個東西放在一起:

xs :: [Int] 
xs = [1] 

當你寫多態函數,你有點像Int抽象。例如,如果你想獲得列表的第一個元素,你可以定義一個函數來爲任何類型的列表定義 - 可以是整數列表或字符列表,甚至列表列表:

firstElement :: [a] -> a 
firstElement (x:xs) = x 

[a]的意思是「一個元素類型爲a的列表」(一種類型),並且僅僅這個a意味着「某種類型的a」。 firstElement是一個從a類型的元素到a類型的元素的函數。 a是一個類型變量。既然你不是說a應該是什麼,該功能適用​​於所有類型的列表:

*Main> firstElement [1,2,3] 
1 

*Main> firstElement ['a','b'] 
'a' 

*Main> firstElement [[1,2],[3,4]] 
[1,2] 

當你寫[[x]]你也許想在函數的第一個參數的類型,這將是一個某些類型x的元素列表列表(x是一個類型變量)。您仍然可以使用,但你必須把它放到你的函數的類型簽名(包含雙冒號行):

sumSubsets :: Num a => [[a]] -> [a] 
sumSubsets xs = map sum xs 

我用a這裏,而不是x,因爲它更普遍完成,但您也可以使用x。不幸的是,Num a描述了對a類型的附加要求(它屬於數字,因爲對於其他事物,sum未定義),整個事情變得有點複雜。爲了簡化問題,你可以寫:

sumSubsetsInts :: [[Int]] -> [Int] 
sumSubsetsInts xs = map sum xs