列表列表,取下一个元素

List of lists, take next element

我有 [[Integer]] -> [Integer] 并且想要获取第一个子列表的第一个元素、第二个子列表的第二个元素和.. nn 个子列表的第 - 个元素,依此类推。

我正在尝试使用列表理解来实现这一点。但是,我首先删除了递增数量的元素,然后取出剩余的元素。但是我又一次不知道如何将 drop (inc z) where z = 0inc c = c + 1 一起用作已经定义的函数,大概是这样的:

getNext :: [[Integer]] -> [Integer]
getNext xs = [y | drop (inc z) (y:ys) <- xs, (y:_) <- xs]
           where z = 0

我知道上面的代码不工作,但我只是到目前为止才想到这个并碰壁了。

你可以这样做:

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

虽然请注意,由于 head.

,此功能是部分功能

您可以 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,在接下来的迭代中获取 59 处的元素。

正如其他答案所建议的那样,您可以将 zip 函数和 zip 与索引列表一起使用。

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

{-# LANGUAGE ParallelListComp #-}

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

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

此外,始终建议使用最通用的函数签名;所以 [[a]] -> [a] 而不是 [[Integer]] -> [Integer]。如果您稍后决定采用 DoubleString、列表、自定义类型...

矩阵的对角线,这将很有用