list - Haskell:从输入列表创建列表元组

标签 list haskell split tuples

我正在尝试设置一些功能来帮助我正在处理的当前项目。我是Haskell的新手,正在努力实现所需的功能。

我有一个列表[a],并希望它输出四个不同列表([b],[b],[b],[b])的元组,其中列表[a]中的每个项都连续放置到输出元组中的下一个列表中。因此,输入列表[a]中的第一个元素进入第一个列表[b][a]中的第二个元素进入第二个列表[b][a]中的第三个元素进入第三个列表[b],依此类推。
我尝试使用chunksOf和splitEvery / splitAt,但是无法获得正确的输出。并且帮助将不胜感激!谢谢!

最佳答案

您每次“旋转” 4元组并添加到第一个元素。因此,我们可以使用如下的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]

关于list - Haskell:从输入列表创建列表元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60685978/

相关文章:

haskell - 字符串到字符列表

r - 分割数据和生成季节性箱线图的最优雅方法是什么?

c# - 从排序列表中删除重复项 C#

c# - 如何使用 LINQ 计算列表中列表中列表的元素?

haskell - 如何在 Haskell 中使用 "overload"美元运算符

haskell - Haskell 中的验证

java - 在java中生成两个IP地址之间的所有IP地址

c# - 使用linq拆分数字和字符串

python - 如何将 for 循环输出写入 csv 文件?

r - 使用lapply函数修改R中的多个矩阵