algorithm - 理解 Haskell 中的矩阵转置函数

标签 algorithm list haskell

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

    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/

相关文章:

algorithm - DAG 上特殊顶点集的大小

java - 最多 k 次买卖股票的最大利润 [递归到 DP]

PHP - 从键生成指定范围内的随机整数

java - jsp中为什么下划线是红色以及如何正确迭代列表

c# - WPF - 将数据库值添加到 List<class>

python - 如何制作列表对象?实例没有属性 '__getitem__'

haskell - Haskell 中的 'cons' 显示为其 Scheme 对应项

haskell - 显式导入是否能够减少编译文件的大小?

Haskell 解析错误 'let'

algorithm - 为什么 Jarvis 的 March ("Gift wrapping algorithm") 的这个实现不起作用?