【问题标题】:List of lists, take next element列表列表,取下一个元素
【发布时间】:2015-08-13 11:09:10
【问题描述】:

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

我正在尝试使用列表推导来实现这一点。但是,我首先删除了递增数量的元素,然后取出剩余元素的头部。但是我又不知道如何使用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

我知道上面的代码不起作用,但我也只是到目前为止才遇到这个问题并碰壁了。

【问题讨论】:

    标签: list function haskell list-comprehension elements


    【解决方案1】:

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

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

    {-# LANGUAGE ParallelListComp #-}
    
    diagonal :: [[a]] -> [a]
    diagonal ls = [l !! i | l <- ls | i <- [0..]]
    

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

    此外,始终建议使用最通用的函数签名;所以[[a]] -&gt; [a] 而不是[[Integer]] -&gt; [Integer]。如果您稍后决定采用Double、String、列表、自定义类型...的矩阵的对角线,这将很有用。

    【讨论】:

      【解决方案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。

      【讨论】:

        【解决方案3】:

        你可以这样做:

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

        虽然注意这个函数是部分的,因为head。

        【讨论】:

          猜你喜欢
          • 2011-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多