在Haskell中理解这个矩阵转置函数

and*_*and 16 algorithm haskell list

这个矩阵转置函数有效,但我试图理解它的逐步执行,我不明白.

    transpose:: [[a]]->[[a]]
    transpose ([]:_) = []
    transpose x = (map head x) : transpose (map tail x)
Run Code Online (Sandbox Code Playgroud)

transpose [[1,2,3],[4,5,6],[7,8,9]]
Run Code Online (Sandbox Code Playgroud)

它返回:

 [[1,4,7],[2,5,8],[3,6,9]]
Run Code Online (Sandbox Code Playgroud)

我不知道连接运算符如何使用map.它是在同一函数调用中连接x的每个头?怎么样?

这是

(map head x)
Run Code Online (Sandbox Code Playgroud)

创建每个列表的头元素列表?

sep*_*p2k 29

让我们看看函数为您的示例输入执行的操作:

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]]
Run Code Online (Sandbox Code Playgroud)

请注意,我选择缩减条款的顺序与haskell将使用的评估顺序不同,但这不会改变结果.

编辑:回复您编辑的问题:

这是

(map head x)
Run Code Online (Sandbox Code Playgroud)

创建每个列表的头元素列表?

是的.

  • ()没有创建列表.内部()和`transpose`的`map`都创建了列表. (4认同)