有人可以解释以下代码吗?使用haskell 检索矩阵的对角线?

Bar*_*n S -3 haskell

mainDiag :: [[a]] -> [a]
mainDiag x = zipWith (!!) x [0..]
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这段代码(特别是zipWith (!!))以及它如何返回矩阵的对角线?

chi*_*chi 5

使用非正式的符号,你可以想象zipWith成这样:

zipWith f [x0,x1,x2,...] [y0,y1,y2,...] = [f x0 y0, f x1 y1, f x2 y2, ...]
Run Code Online (Sandbox Code Playgroud)

在你的情况下,zipWith (!!) x [0..]我们有

x = [x0,x1,x2,...]
[0,1,2,...] = [y0,y1,y2]  (that is yn=n for all natural n)
(!!) = f
Run Code Online (Sandbox Code Playgroud)

因此,结果是

[(!!) x0 0, (!!) x1 1, (!!) x2 2, ...]
Run Code Online (Sandbox Code Playgroud)

这也写成

[x0 !! 0, x1 !! 1, x2 !! 2, ...]
Run Code Online (Sandbox Code Playgroud)

此列表包含 list 中位置 0 中的元素,listx0中位置 1中的元素x1,依此类推。因此,这是原始 list-of-lists 的对角线x。