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

时间:2016-08-18 15:13:24

标签: list haskell functional-programming 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])

我很感激任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:7)

我们必须扭转内部列表和外部列表。要反转内部列表,您可以使用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

答案 1 :(得分:1)

最自然的方法肯定是<div id="hello"></div> The labelText attribute is: <div id="attribute"></div> The resulting HTML is: <div id="theHTML"></div>map reverse . reverse。但是,明确地交错操作可能是最有效的:

reverse . map reverse

如果您想玩高尔夫代码,可以将其写为

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

但不要这样做。