我想要做的就是总结列表清单。我想要的例子做:总结列表清单时出现“非穷举模式”错误
输入:[[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