我正在尝试构建一个适用于列表列表的函数。这个函数将每个列表的第一个元素放在大列表中,将它们放在一个列表中,然后为第二个元素执行此操作,等等。 例如:
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]]。
答案 0 :(得分:0)
评论回答你的问题。但是,更通用/抽象的版本将适用于任何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]]