合并多个清单

时间:2019-11-14 06:52:31

标签: haskell

haskell中是否可以将多个列表合并为一个列表? 例如:

输入:

[
[0,2,0,4,0,6,0,1,0,3,0,0,0,0,0],
[0,0,3,0,0,6,0,0,2,0,0,0,0,0,1],
[0,0,0,4,0,0,0,1,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,3,0,0,0,0,1]
] 

预期输出: [0,2,3,4,0,6,0,1,2,3,0,0,0,0,1]

1 个答案:

答案 0 :(得分:2)

您可以使用transpose(可能需要Data.List)来交换表的行和列,以简化处理。

示例:

[[0, 1, 0, 2, 3],
 [0, 0, 2, 0, 3]]

成为

[[0, 0],
 [1, 0],
 [0, 2],
 [2, 0],
 [3, 3]]

现在您有了旧列的列表,因此可以一个一个地处理它们。例如,您可以编写这样的函数:

merge list = case dropWhile (== 0) of [] -> 0
                                      (x:_) -> x

在这里,我们从列表中删除所有前导零,然后查看其余列表是否具有某个值,然后采用它,否则得到0。

现在我们可以使用此功能来处理转置表,如下所示:

mergeLists lists = map merge (transpose lists)

现在,我们可以删除括号:

mergeLists lists = map merge $ transpose lists

甚至摆脱争论(使用合成方法):

mergeLists = map merge . transpose

在这里,我们说合并列表是1)换位表格和2)用merge处理每一列。这三个版本中的每个版本都是等效的,因此您可以使用它们中的任何一个。

一些关于构图的进一步阅读:http://learnyouahaskell.com/higher-order-functions#composition

您可以在此处查看其工作方式:https://repl.it/repls/ReasonablePerfectOptimization

编辑:修复了merge以使用模式匹配