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
你可以通过使用获得你想要的东西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,而不是一套,但因为听起来你真的想在这里懒惰,我觉得这是最好的.