繁体   English   中英

在clojure中映射懒惰

[英]Map laziness in clojure

我正在Clojure中构建一个简单的swing GUI。 我试图通过在let的上下文中使用map将单个函数应用于多个GUI组件:

(map #(f % component4) [component1 component2 component3])

组件全部在let中定义。

有问题的是,map是懒惰的,并且动作不会应用于组件,但是,我可以通过将上面的内容包装在“take”中来强制它。

有地图的非懒惰替代方案吗? 或者我应该以不同的方式解决这个问题?

编辑:在eclipse中使用逆时针方向。 我使用REPL中的(使用'Lib:reload)并使用编辑器中的CTRL + Enter获得了不同的结果。 重新加载会启动GUI,但会出现上述问题。 从编辑器使用CTRL + Enter时没有出现问题,因此我认为我对问题的描述可能不准确。 无论如何,在这种情况下,doseq似乎是更好的替代方案。

我挑战你的断言,即参与take会产生任何不同。 如果你把它包裹在doall或者dorun它会做你想要的,但是你应该考虑使用doseq而不是map来进行这种只有副作用的动作。

注意

最初发布为对问题的评论; 复制回答受欢迎的需求。

doseq可能是解决这个问题的最好方法。 doseq大致相当于“for-each”语句,它在许多其他语言中循环遍历集合的每个元素。 保证不会偷懒。

(doseq 
  [comp [component1 component2 component3]]
  (f comp component4))

一些一般建议:

  • 如果希望序列作为输出 ,请使用地图及其懒惰的朋友(包括拍摄,放下等)
  • 当您对副作用更感兴趣时,请使用doseqdoalldotimes

在doall中包装地图将强制进行评估。 或更好的替代品是剂量q,用于涉及副作用的事物。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM