[英]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 [[3,4,5],[7,5,2]] == [[2,5,7],[5,4,3]]
。
一個執行該功能的函數只是reverse
和map reverse
的組合,因此rev = reverse . map reverse
rev = reverse . map reverse
。
在這里,我們首先反轉內部列表,然后反轉外部列表,但是順序並不重要,我們可以用另一種方法來實現: rev = map reverse . reverse
rev = map reverse . reverse
。
最自然的方法當然是將map reverse . reverse
map reverse . reverse
或reverse . map reverse
reverse . map reverse
。 但是,顯式地交錯操作可能是最有效的:
revrev :: [[a]] -> [[a]]
revrev = foldl (\ acc xs -> reverse xs : acc) []
如果您想打高爾夫,可以這樣寫:
revrev=foldl(flip((:).reverse))[]
但不要那樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.