在 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
对列表的每个元素应用 reverse
:map 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]]
.
执行此操作的函数只是 reverse
和 map reverse
的组合,因此 rev = reverse . map reverse
.
这里我们先反转内表,再反转外表,但是顺序并不重要,我们可以反过来:rev = map reverse . reverse
.
最自然的方法当然是 map reverse . reverse
或 reverse . map reverse
。然而,明确地交错操作可能是最有效的:
revrev :: [[a]] -> [[a]]
revrev = foldl (\ acc xs -> reverse xs : acc) []
如果你想玩代码高尔夫,你可以这样写
revrev=foldl(flip((:).reverse))[]
但不要那样做。
我是 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
对列表的每个元素应用 reverse
:map 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]]
.
执行此操作的函数只是 reverse
和 map reverse
的组合,因此 rev = reverse . map reverse
.
这里我们先反转内表,再反转外表,但是顺序并不重要,我们可以反过来:rev = map reverse . reverse
.
最自然的方法当然是 map reverse . reverse
或 reverse . map reverse
。然而,明确地交错操作可能是最有效的:
revrev :: [[a]] -> [[a]]
revrev = foldl (\ acc xs -> reverse xs : acc) []
如果你想玩代码高尔夫,你可以这样写
revrev=foldl(flip((:).reverse))[]
但不要那样做。