我想要做的就是總結列表清單。我想要的例子做:總結列表清單時出現「非窮舉模式」錯誤
輸入:[[1,2,3],[2,5],[6,7]]
輸出:[6,7,13]
名單外列表內的量能變化,以及整數的每個內部列表量可以變化。我試過千頭萬緒,這是最後一個我試過,但它不工作:
sumSubsets [[x]] = map sum [[x]]
另外,我想sumSubsets [] = [[]]
的基本情況,但導致的錯誤也是如此。任何幫助,將不勝感激。
我想要做的就是總結列表清單。我想要的例子做:總結列表清單時出現「非窮舉模式」錯誤
輸入:[[1,2,3],[2,5],[6,7]]
輸出:[6,7,13]
名單外列表內的量能變化,以及整數的每個內部列表量可以變化。我試過千頭萬緒,這是最後一個我試過,但它不工作:
sumSubsets [[x]] = map sum [[x]]
另外,我想sumSubsets [] = [[]]
的基本情況,但導致的錯誤也是如此。任何幫助,將不勝感激。
你可以使用
sumSubsets x = map sum x
甚至
sumSubsets = map sum
你以前的代碼,
sumSubsets [[x]] = map sum [[x]]
首先執行使用它匹配包含一個列表[[x]]
一個模式匹配元素,這本身就是一個包含單個元素的列表。因此,將在[[3]]
>> sumSubsets [[3]]
[3]
但無法正常運作。[[1,2,3]]
或[[1],[2]]
。
我認爲你的問題主要來自混合類型和值,這可能容易發生在初學者,特別是列表中。整個混淆可能來自這樣的事實:在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
'地圖sum'應該是足夠了... – Alec
A-了頭:我已經改變了標題,以更好地反映潛在的問題,並提錯誤,(我假設)你看到了。 (在這種情況下,引用你得到的錯誤總是一個好主意。) – duplode