这个矩阵转置函数有效,但我试图逐步理解它的执行过程,但我不明白。
transpose:: [[a]]->[[a]]
transpose ([]:_) = []
transpose x = (map head x) : transpose (map tail x)
与
transpose [[1,2,3],[4,5,6],[7,8,9]]
它返回:
[[1,4,7],[2,5,8],[3,6,9]]
我不明白串联运算符是如何与 map 一起工作的。它在同一个函数调用中连接 x 的每个头部?怎么办?
这是
(map head x)
创建每个列表的头元素列表?
最佳答案
让我们看看函数对您的示例输入做了什么:
transpose [[1,2,3],[4,5,6],[7,8,9]]
<=>
(map head [[1,2,3],[4,5,6],[7,8,9]]) : (transpose (map tail [[1,2,3],[4,5,6],[7,8,9]]))
<=>
[1,4,7] : (transpose [[2,3],[5,6],[8,9]])
<=>
[1,4,7] : (map head [[2,3],[5,6],[8,9]]) : (transpose (map tail [[2,3],[5,6],[8,9]]))
<=>
[1,4,7] : [2,5,8] : (transpose [[3],[6],[9]])
<=>
[1,4,7] : [2,5,8] : (map head [[3],[6],[9]]) : (transpose (map tail [[3],[6],[9]]))
<=>
[1,4,7] : [2,5,8] : [3, 6, 9] : (transpose [[], [], []])
<=>
[1,4,7] : [2,5,8] : [3, 6, 9] : [] -- because transpose ([]:_) = []
<=>
[[1,4,7],[2,5,8],[3,6,9]]
请注意,我选择减少项的顺序与 haskell 将使用的评估顺序不同,但这不会改变结果。
编辑:回应您编辑的问题:
is this
(map head x)
creating a list of the head elements of each list?
是的,是的。
关于algorithm - 理解 Haskell 中的矩阵转置函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2578930/