簡體   English   中英

反轉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]]結果reverse $ map reverse [[3,4,5],[7,5,2]] == [[2,5,7],[5,4,3]]

一個執行該功能的函數只是reversemap reverse的組合,因此rev = reverse . map reverse rev = reverse . map reverse

在這里,我們首先反轉內部列表,然后反轉外部列表,但是順序並不重要,我們可以用另一種方法來實現: rev = map reverse . reverse rev = map reverse . reverse

最自然的方法當然是將map reverse . reverse map reverse . reversereverse . 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM