【问题标题】:Accessing nth element of a list in list in Haskell在 Haskell 中访问列表中列表的第 n 个元素
【发布时间】:2017-05-12 21:39:49
【问题描述】:

我正在尝试构建一个适用于列表列表的函数。此函数将获取大列表中每个列表的第一个元素,将它们一起放入一个列表中,然后对第二个元素执行此操作,依此类推。 例如:

tr[[1,2,3],[4,5,6]]    
=> [[1,4],[2,5],[3,6]

它适用于任何数据类型,但现在我正在尝试使其适用于 Int

这是我目前所拥有的,只是数据声明和空输入的情况:

tr :: [[a]] -> [[a]]

tr [] = []

非常感谢任何帮助,甚至是指向有信息的地方的指针。我的想法是它将使用 ++ 运算符,以及对 List 元素的 x:xs 操作。我的问题是弄清楚如何分别访问每个列表的头部,而不仅仅是第一个列表。我可以使用以下示例从示例中获取 1:head $ head [[1,2,3]]。

【问题讨论】:

  • 所以您要转置列表列表?
  • 看看this 可能是值得的,这正是你想要的
  • @EliSadoff 是的,实际上它是换位,我没有看到它是!谢谢:)
  • 别担心! Hoogle 是一个很棒的资源。
  • 我可以推荐haskellbook.com

标签: list haskell


【解决方案1】:

评论回答您的问题。但是,更通用/抽象的版本将适用于任何 Foldable 数据结构,而不仅仅是列表。这可以通过嵌套的右折叠来完成:

import Prelude hiding (foldr)  -- older version ghc
import Data.Foldable (foldr, Foldable)

tr :: (Foldable f, Foldable s) => f (s a) -> [[a]]
tr = takeWhile (not . null) . foldr (foldr go id) (repeat [])
  where go i f (x:xs) = (i:x): f xs

然后:

\> tr [[10,11],[20],[],[30,31,32]] 
[[10,20,30],[11,31],[32]]

\> tr [Just 1, Nothing, Just 2]
[[1,2]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多