繁体   English   中英

Haskell:从输入列表创建一个列表元组

[英]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]

定义

f n = transpose . chunksOf n
g xs = let [xs1, xs2, xs3, xs4] = f 4 xs in (xs1, xs2, xs3, xs4) 

其中f是通用解。 这给

Prelude> g ['a' .. 'z']
("aeimquy","bfjnrvz","cgkosw","dhlptx") 

签名

Prelude> :t g
g :: [a] -> ([a], [a], [a], [a])

Prelude> :t f
f :: Int -> [a] -> [[a]]

相关信息:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM