[英]Haskell: create a tuple of lists from an input list
我正在尝试设置一些功能来帮助我正在处理的当前项目。 我是 Haskell 的新手,正在努力实现我想要的功能。
我有一个列表[a]
和将它想输出的四个不同的列表的元组([b],[b],[b],[b])
其中在列表中每个项目[a]
被相继放置在到输出元组中的下一个列表。 因此,在输入列表中的第一个元素[a]
进行到第一列表[b]
在第二元件[a]
进行到第二列表[b]
在第三元件[a]
变成所述第三列表[b]
等等。 我曾尝试使用 chunksOf 和 splitEvery/splitAt 但无法获得正确的输出。 和帮助将不胜感激! 谢谢!
您每次“旋转”四元组并添加到第一个元素。 因此,我们可以使用如下所示的foldr
模式来实现:
toFour :: [a] -> ([a], [a], [a], [a])
toFour = foldr (\a (bs, cs, ds, as) -> (a:as, bs, cs, ds)) ([], [], [], [])
或以无可辩驳的模式:
toFour :: [a] -> ([a], [a], [a], [a])
toFour = foldr (\a ~(bs, cs, ds, as) -> (a:as, bs, cs, ds)) ([], [], [], [])
所以这里的(bs, cs, ds, as)
是我们为列表尾部生成的 4 元组,我们向右“旋转”以构造元组(as, bs, cs, ds)
然后添加项目a
到 4 元组的第一个列表。
对于整数列表,这给了我们:
Prelude> toFour [1..2]
([1],[2],[],[])
Prelude> toFour [1..3]
([1],[2],[3],[])
Prelude> toFour [1..4]
([1],[2],[3],[4])
Prelude> toFour [1..5]
([1,5],[2],[3],[4])
Prelude> toFour [1..6]
([1,5],[2,6],[3],[4])
Prelude> toFour [1..10]
([1,5,9],[2,6,10],[3,7],[4,8])
当我们使用不可反驳的模式时,这是惰性完成的,因此我们可以例如分配无限列表的元素,然后以获取第二项的前 10 个元素为例:
Prelude> (\(_, l, _, _) -> take 10 l) (toFour [1..])
[2,6,10,14,18,22,26,30,34,38]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.