2017-02-14 37 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