2016-12-27 56 views
2

如果我在Data.Map M中有兩個鍵k0和k1,如何從地圖中刪除k0並用k0替換k1?替換Data.Map中的鍵

什麼是完成此任務的最佳方法?我試圖通過Data.Map的文檔,但我只能找到可以更改值的函數。

+0

你好,歡迎來到StackOverflow。請花一些時間閱讀幫助頁面,尤其是名爲[「我可以詢問什麼主題?」(http://stackoverflow.com/help/on-topic)和[「我應該問什麼類型的問題避免問?「](http://stackoverflow.com/help/dont-ask)。更重要的是,請閱讀[Stack Overflow問題清單](http://meta.stackexchange.com/q/156810/204922)。您可能還想了解[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –

+1

我有點不贊同downvote。這個問題可能會顯示出更多的努力,但手頭的任務足夠小,可以用一句話精確描述,如上所述。 – chi

回答

6

據我所見,沒有單一的庫函數可以有效地執行此操作。然而,你可以自己做這樣的事情:

case M.lookup k0 myMap of 
    Nothing -> myMap 
    Just e -> M.insert k1 e (M.delete k0 myMap) 

這將需要三個映射操作,每個花費O(logN)。

我們可以在兩個操作如下做到這一點:

case updateLookupWithKey (\_ _ -> Nothing) k0 myMap of 
    (Nothing, _ ) -> myMap 
    (Just e, newMap) -> M.insert k1 e newMap 

我不認爲這可以進一步提高,有兩個不同的鍵打交道時,因爲我們需要無論如何訪問底層平衡搜索樹兩次。