我正在编写一些代码,并且我认为我可以从无限的元组列表中创建一个无限的映射。以下内容:
Map.fromList [(i,i+1)|i<-[1..]]
当然,我立刻发现Data.Map和Data.Set分别不支持无限的Maps和Sets。我注意到一个类似的问题,关于Data.Set贪婪的fromList
实现,并且在阅读了答案here之后,很清楚懒惰和贪婪的实现都可能用于Set,只是贪婪的实现工作更好。但是,我真的不明白为什么懒惰的Map.fromList
实现不起作用。与存储密钥的方式有关吗?
答案 0 :(得分:13)
Data.Map
实现为平衡树(我认为大致是二进制的);如果没有对输入的一些预知,很难懒惰地创建和平衡无限二叉树!但是,您可能喜欢MemoTrie包之类的东西,它使用惰性无限尝试(位)。
> let x = trie (\x -> x+1)
> untrie x 72
73
> untrie x 37
38