在clojure中懒洋洋地构建

Phi*_*lip 2 clojure set lazy-evaluation

我已经开始学习clojure,但是我无法绕过某些概念.例如,我想在这里做的是采取这个函数并转换它,以便它懒洋洋地调用get-origlabels.

(defn get-all-origlabels []
    (set (flatten (map get-origlabels (range *song-count*)))))
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试使用递归但是炸毁了堆栈(歌曲数量大约是10,000).我无法弄清楚如何使用尾递归来做到这一点.

get-origlabels每次调用时都会返回一个集合,但值通常会在调用之间重复.get-origlabels函数实际上做的是读取一个文件(每个值的一个不同的文件,从0到song-count -1)并将一个存储在其中的单词返回到一个集合中.

任何指针将不胜感激!

谢谢!-Philip

trp*_*lin 7

你可以通过使用获得你想要的东西mapcat.我相信把它放到一个真正的Clojure集合中会使它消失,正如(take 10 (set (iterate inc 0)))在10点之前尝试实现整个集合的事实所表明的那样.

(distinct (mapcat get-origlabels (range *song-count*)))
Run Code Online (Sandbox Code Playgroud)

这会给你一个懒惰的序列.您可以通过执行类似的操作来验证,从无限序列开始:

(->> (iterate inc 0)
     (mapcat vector)
     (distinct)
     (take 10))
Run Code Online (Sandbox Code Playgroud)

你最终会得到一个seq,而不是一套,但因为听起来你真的想在这里懒惰,我觉得这是最好的.

  • (iterate inc 0)与(range)相同,所以你可以稍微缩短一下. (2认同)
  • 你也可以说懒惰的反面是"渴望".`set`功能非常渴望. (2认同)