相关疑难解决方法(0)

mapcat打破了懒惰

我有一个函数生成称为函数的惰性序列.

如果我运行代码:

(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

concat clojure lazy-sequences

10
推荐指数
2
解决办法
1244
查看次数

标签 统计

clojure ×1

concat ×1

lazy-sequences ×1