列表列表,取下一个元素
List of lists, take next element
我有 [[Integer]] -> [Integer]
并且想要获取第一个子列表的第一个元素、第二个子列表的第二个元素和.. n第 n 个子列表的第 - 个元素,依此类推。
我正在尝试使用列表理解来实现这一点。但是,我首先删除了递增数量的元素,然后取出剩余的元素。但是我又一次不知道如何将 drop (inc z) where z = 0
与 inc 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
,在接下来的迭代中获取 5
和 9
处的元素。
正如其他答案所建议的那样,您可以将 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]
。如果您稍后决定采用 Double
、String
、列表、自定义类型...
矩阵的对角线,这将很有用
我有 [[Integer]] -> [Integer]
并且想要获取第一个子列表的第一个元素、第二个子列表的第二个元素和.. n第 n 个子列表的第 - 个元素,依此类推。
我正在尝试使用列表理解来实现这一点。但是,我首先删除了递增数量的元素,然后取出剩余的元素。但是我又一次不知道如何将 drop (inc z) where z = 0
与 inc 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
,在接下来的迭代中获取 5
和 9
处的元素。
正如其他答案所建议的那样,您可以将 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]
。如果您稍后决定采用 Double
、String
、列表、自定义类型...