我有rootViewController
并希望获取第一个子列表的第一个元素,第二个子列表的第二个元素以及...的 n -th元素 n -th子列表等等。
我正在尝试使用列表推导来实现这一点。但是,我首先丢弃一个递增数量的元素,然后取下剩下的元素。但是,我再也不知道如何将UIWindow
与[[Integer]] -> [Integer]
一起用作已经定义的函数,大概是这样的:
drop (inc z) where z = 0
我知道上面的代码无法正常工作,但我到目前为止只能达到这个目标并撞墙。
答案 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]
。如果您以后决定采用Double
,String
,列表,自定义类型等矩阵的对角线,这可能很有用。
答案 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
开始,zip
与xs
一起创建。因此,在每次迭代时,zip
的结果将像这样使用
[1, 2, 3] !! 0
[4, 5, 6] !! 1
[7, 8, 9] !! 2
我们在第一次迭代时获得索引0
的元素1
,并在以下迭代中获得5
和9
。