clojure哈希映射的懒惰是否有意义?

Don*_*Don 3 clojure

我需要从我的函数返回一个序列,一个数字和一个哈希映射(所有包装在一个向量中),以便打印的返回值如下所示:

[ ([:c :a] [:e :c] [:f :e] [:d :e] [:g :f] [:b :a])  15
  {:g :c, :f :a, :c :e, :d :a, :b :a, :c :a} ]
Run Code Online (Sandbox Code Playgroud)

由于我的输入可能很大,我想从我的函数返回延迟序列/对象.对的序列(我的返回向量中的第一个对象)很容易通过在构建它的conj调用周围包装'lazy-seq'来使其变得懒惰.

哈希映射(我的返回向量中的第三个对象,可能像我的序列一样非常大)正在与序列相同的循环 - 重复块中构建(使用assoc调用).哈希映射是我的一些调用者将使用的附加信息,但如果对序列被返回为惰性,那么我想知道是否有意义发回一个潜在的巨大哈希映射与(一个有效的)lazy-seq即使我把它作为一个可选的返回值.散列映射中的条目与惰性序列中的对相关.

所以这是我的noobie问题:在发送一个懒惰的MapEntry序列代替大型HashMap时有什么意义吗?也就是说,假设用户将获取一小部分laEq-Map的MapEntrys,将它们转换为hashmap以进行查找...即将获取下一个块,依此类推.这是一种懒惰地使用关联数据的合理方法吗?在Clojure中是否有一些惯用的方法来返回/管理大型关联数据?我很欣赏任何关于我的选择的想法.在此先感谢您的帮助.

ama*_*loy 6

不,给他们一个懒惰的地图是不可能的.一个懒惰的MapEntries序列是可能的,但不是很有用.但是,有许多其他可能有意义的选项是相似的.

  • 你说调用者可能根本不需要地图:所以返回地图的延迟,如果他们需要它们可以强制执行.
  • 如果键计算成本低,但值很昂贵,则可以返回带有正确键的完整映射,以及每个延迟的值; 调用者只能强制他们需要的值.

你仍然可以返回一个lazy-seq的向量(我不打算让它们成为MapEntries),但是调用者基本上没办法把它当作一个懒惰的地图.要么他们只想查找一组固定的已知密钥(在这种情况下,他们只是懒得过滤条目,从不使它成为地图)或者他们想要任意查找条目,在这种情况下他们会在查找第一个条目后,必须将所有条目保留在内存中,这样它们仍然可以查找第二个条目,因此它们也可以将整个条目转储到完全实现的映射中.