当您想要Clojure中的副作用和保留值时,使用什么功能?

Lov*_*ing 5 clojure

人们说避免使用map顺序执行副作用,这是有道理的.

但在现实世界中,我发现自己需要保留结果并map急切地评估,即插入数据库并返回记录时.

这是(doall (map ..))我唯一的选择吗?有没有比较惯用的方法呢?

Chr*_*phy 5

(doall (map ..))是不是你唯一的选择:mapv是不是懒惰,所以它确实有效(doall (map ..)),但在一个操作.

这是不是很大为使用mapmapv使用地图功能产生副作用.而是尝试使用doseq,这清楚地表明将发生副作用.正如你所指出的,这就是问题的症结所在,问题doseq在于返回结果不是按顺序聚集在一起,因为它们是map或者mapv.

如果你不想要一个懒惰的序列,那么首先尝试不生成它,而不是生成它,然后强制它像你现在一样实现.因此我们应该排除使用map.

大多数不需要懒惰的情况可以通过mapv地图功能没有副作用时使用,或者doseq在没有返回结果的情况下使用.

如果你的地图功能都产生了结果,并且是副作用,并且你希望将这些结果收集在一起,那么你最好的选择就是使用mapv一个名为明显产生副作用的地图功能,通过名字结束在!.虽然这不是很好用mapv,但至少!清楚地突出了正在发生的事情.

  • @LoveProgramming更新和提取都是副作用(任何类型的I/O都会排除引用透明性),因此在两个阶段中执行它不会保留任何纯度. (2认同)

小智 3

我会(doall (map ..))按照您所说的那样使用,因为很清楚您的代码中的意图是什么。mapv也有效,尽管意图有点模糊。