我对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])
我很感激任何帮助。提前谢谢。
答案 0 :(得分:7)
我们必须扭转内部列表和外部列表。要反转内部列表,您可以使用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
。
答案 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) []
但不要这样做。