我有一个函数生成称为函数的惰性序列.
如果我运行代码:
(map a-function a-sequence-of-values)
Run Code Online (Sandbox Code Playgroud)
它按预期返回一个惰性序列.
但是当我运行代码时:
(mapcat a-function a-sequence-of-values)
Run Code Online (Sandbox Code Playgroud)
它打破了我的功能的懒惰.事实上,它将代码转换为
(apply concat (map a-function a-sequence-of-values))
Run Code Online (Sandbox Code Playgroud)
因此,在连接这些值之前,需要从地图中实现所有值.
我需要的是一个函数,它可以根据需要连接map函数的结果,而不事先预先知道所有的map.
我可以为此修改一个函数:
(defn my-mapcat
[f coll]
(lazy-seq
(if (not-empty coll)
(concat
(f (first coll))
(my-mapcat f (rest coll))))))
Run Code Online (Sandbox Code Playgroud)
但我不敢相信clojure没有做过任何事情.你知道clojure有这样的功能吗?只有少数人和我有同样的问题?
我还找到了一个处理相同问题的博客:http://clojurian.blogspot.com.br/2012/11/beware-of-mapcat.html