【发布时间】:2016-05-29 15:51:53
【问题描述】:
所以我被要求在 haskell 中为我的每周作业编写一个函数 diag :: [[a]] -> [a],它返回一个格式良好的矩阵的所有对角线,例如:
生成列表:[a11,a12,a21,a13,a22,a31,a14,a23,a32,a24,a33,a34]。
由于我们不允许使用任何第三方包,例如 Data.matrix,而且我无法完全理解 this post 中的实现,我希望您能对此提供帮助。
编辑:
【问题讨论】:
-
如果行是
(x:xs),diagonals (x:xs)与diagonals xs有什么关系? -
如果您说您了解/不了解哪些部分,我很乐意在链接的答案中详细解释我的实现。
-
@DanielWagner 这部分让我很困惑:
go b es_ = [h | h:_ <- b] : case es_ of [] -> transpose ts e:es -> go (e:ts) es where ts = [t | _:t <- b]。我是 FP 的新手,我知道有一个名为 go 的函数,带有参数b和es_。但是case和这个“模式匹配”到底是什么(在我看来就是这样)。 -
@ErikR 我不太确定你想指出什么......
-
@GabbaGandalf
case es_ of [] -> branch1; e:es -> branch2检查es_是否为空列表,在这种情况下它的值为branch1,或者它是否为非空,在这种情况下它命名第一个元素e,列表的其余部分es,然后变为值branch2。如果您熟悉用这些术语思考递归函数,请考虑“基本案例”与“递归案例”。在这个特定的case中,es_会跟踪我们在遍历中还没有开始遍历的行,因此它将采用第一个分支,直到到达最长的对角线。