2016-08-18 57 views
0

倒車名單,我很新的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]) 

我會很感激任何幫助。提前致謝。

+3

點自由,這只是'REV =反轉。地圖反向# – Alec

+0

太棒了!謝謝。 – ZCoder

+0

順便說一句,通過模式匹配來寫'reverse'的自然方法是使用輔助函數和累積列表;首先'rev ls = loop [] ls' then'loop acc [] = acc;循環acc(a:as)=循環(a:acc)ls' – Michael

回答

7

我們必須扭轉內部列表和outter列表。爲了扭轉內部列表,你可以使用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

+0

它工作得很好!謝謝。 – ZCoder

+0

無論您是首先顛倒內部還是外部列表,都無關緊要。 – Ingo

+0

@Ingo你是正確的,這是談話,使解決方案更加清晰的一種簡便的方式和思維過程更加清晰;)但我會添加一個精密 – villou24

1

最自然的方法肯定是要麼map reverse . reversereverse . map reverse。這也可能是最有效的,但是,明確交錯操作:

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

如果你想打高爾夫的代碼,你可以寫爲

revrev=foldl(flip((:).reverse))[] 

,但不這樣做。

相關問題