2014-12-07 54 views
0

我正在为明天的期末考试进行锻炼。我正在尝试一些奇怪的例子。例如,我给出了一个这样的子列表:[[1, 2], [2, 3, 4], [5, 6], [7, 8], [8, 9, 10]]。我想将第二和第三个子列表加在一起,并使用列表理解返回它们的总和。我尝试了很多东西,但我无法成功。如何正确添加列表理解的第二和第三个子列表

我意识到列表理解会生成每个子列表的cons对并尝试添加每个cons对的第二个和第三个元素。但这不是我想要的。我想输出[20],因为2 + 3 + 4 + 5 + 6 = 20.

我写了这个,我试图只在cons对中添加第二个子列表。但是,那么也无法生成第三个子列表。所以,我种的卡:

sumTwoThree::[[Int]]->[Int] 
sumTwoThree list = [(x + xs) | (x:xs)<-(list!!1)] 

我也写过这样的:

sumTwoThree::[[Int]]->[Int] 
sumTwoThree list = [head xs + head (tail xs) | (x:xs)<-list, (length xs > 1)] 

但这只能产生至少有3个元素,然后将其相加的第2和第3个元素的子列表这些子列表。

+0

为什么要使用列表理解的任何特定原因,在这里? – Jubobs 2014-12-07 17:36:03

+0

因为我试图行使列表理解。 – 2014-12-07 17:38:06

回答

2

基本上,你想过滤掉任何不是第二或第三的子列表,然后将它们包含在结果中。之后,您使用sum。像这样:

sumTwoThree xs = sum [x | (i, sub) <- zip [1,2..] xs, 
          i == 2 || i == 3, 
          x <- sub] 

你不能在不使用sum功能做到这一点。这是因为列表理解仅仅是使用列表monad的语法糖。你必须折叠列表来计算其元素的总和。

如果你想真正得到什么列表解析,那么了解列表单子是一个好主意,甚至试图理解它是如何工作的:

foo []  = [[]] 
foo (x:xs) = [x':xs' | x' <- x, xs' <- foo xs] 

然后观察它做什么:

Main*> foo ["123", "abc"] 
["1a","1b","1c","2a","2b","2c","3a","3b","3c"] 
相关问题