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]
答案 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
以使用模式匹配