列表清单,采取下一个要素

时间:2015-05-30 17:06:51

标签: list function haskell list-comprehension elements

我有rootViewController并希望获取第一个子列表的第一个元素,第二个子列表的第二个元素以及...的 n -th元素 n -th子列表等等。

我正在尝试使用列表推导来实现这一点。但是,我首先丢弃一个递增数量的元素,然后取下剩下的元素。但是,我再也不知道如何将UIWindow[[Integer]] -> [Integer]一起用作已经定义的函数,大概是这样的:

drop (inc z) where z = 0

我知道上面的代码无法正常工作,但我到目前为止只能达到这个目标并撞墙。

3 个答案:

答案 0 :(得分:3)

你可以这样做:

getNext :: [[a]] -> [a]
getNext xs = [ head $ drop y x | (x,y) <- zip xs [0..]]

虽然请注意,由于head,此功能是部分的。

答案 1 :(得分:3)

正如其他答案所示,您可以使用zip函数和zip与索引列表。

Glasgow Haskell编译器(GHC)但提供Parallel List Comp扩展名:

{-# LANGUAGE ParallelListComp #-}

diagonal :: [[a]] -> [a]
diagonal ls = [l !! i | l <- ls | i <- [0..]]

(!!)运算符从列表中获取 i -th元素。

此外,始终建议使用最通用的功能签名;所以[[a]] -> [a]代替[[Integer]] -> [Integer]。如果您以后决定采用DoubleString,列表,自定义类型等矩阵的对角线,这可能很有用。

答案 2 :(得分:2)

您可以zip实际的整数列表列表和另一个从0到无穷大的列表并获取相应的元素,如下所示

picker :: [[Integer]] -> [Integer]
picker xs = [(x !! y) | (x, y) <- (zip xs [0..])]

main = print $ picker [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
-- [1,5,9]

表达式[0..]将懒惰地创建一个无限列表,从0开始,zipxs一起创建。因此,在每次迭代时,zip的结果将像这样使用

[1, 2, 3] !! 0
[4, 5, 6] !! 1
[7, 8, 9] !! 2

我们在第一次迭代时获得索引0的元素1,并在以下迭代中获得59