在 Haskell 中反转另一个列表中的列表

Reversing a list in another list in Haskell

我是 Haskell 的新手,我正在尝试反转列表。同时我想反转该列表中的列表。例如:

Prelude> rev [[3,4,5],[7,5,2]]
[[2,5,7],[5,4,3]]

我知道下面的代码反转了一个列表:

rev :: [[a]] -> [[a]]
rev [[]] = [[]]
rev [[x]] = [[x]]
rev xs = last xs : reverse (init xs)

我已经苦苦挣扎了一段时间,我对代码做了一些补充,但它仍然无法正常工作,我被卡住了。

rev :: [[a]] -> [[a]]
rev [[]] = [[]]
rev [[x]] = [[x]]
rev xs = last xs : reverse (init xs)
rev [xs] = last [xs] : reverse (init [xs])

如果有任何帮助,我将不胜感激。提前致谢。

我们必须反转内部列表和外部列表。要反转内部列表,您可以使用 map 对列表的每个元素应用 reversemap reverse [[3,4,5],[7,5,2]] == [[5,4,3],[2,5,7]]。然后再次反转结果 reverse $ map reverse [[3,4,5],[7,5,2]] == [[2,5,7],[5,4,3]].

执行此操作的函数只是 reversemap reverse 的组合,因此 rev = reverse . map reverse.

这里我们先反转内表,再反转外表,但是顺序并不重要,我们可以反过来:rev = map reverse . reverse.

最自然的方法当然是 map reverse . reversereverse . map reverse。然而,明确地交错操作可能是最有效的:

revrev :: [[a]] -> [[a]]
revrev = foldl (\ acc xs -> reverse xs : acc) []

如果你想玩代码高尔夫,你可以这样写

revrev=foldl(flip((:).reverse))[]

但不要那样做。