2012-04-21 78 views
6

我正在編寫一些代碼,我想我可以從無限的元組列表中創建一個無限映射。沿線的東西如下: Map.fromList [(i,i+1)|i<-[1..]]Haskell的無限地圖

當然,我立即發現Data.Map和Data.Set不支持無限地圖和集分別。我注意到了一個類似的問題,關於Data.Set的fromList的貪婪實現,並且在閱讀了here的回答之後,很明顯懶惰和貪婪的實現對Set都是可能的,只是貪婪的更好。然而,我並不瞭解爲什麼Map.fromList的懶惰實現不起作用。與密鑰存儲方式有關?

+8

如何知道列表的哪個元素是最終樹的根節點而不知道整個列表? – sepp2k 2012-04-21 19:35:12

回答

13

Data.Map被實現爲一個平衡樹(大致二元,我認爲);如果沒有預先知道輸入信息,很難創建並平衡無限的二叉樹!但是,您可能會喜歡MemoTrie包,它使用延遲無限嘗試(位)。

> let x = trie (\x -> x+1) 
> untrie x 72 
73 
> untrie x 37 
38