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

时间:2017-07-26 23:28:25

标签: clojure

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

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

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

2 个答案:

答案 0 :(得分:5)

没有。 (doall (map ..))不是您唯一的选择:mapv不是懒惰的,所以它有效地(doall (map ..)),但是在一次操作中。

mapmapv用于产生副作用的地图功能并不是很好。而是尝试使用doseq,这清楚地表明会发生副作用。正如您所指出的那样,问题就在于问题的关键,doseq的问题在于,返回结果不是按顺序收集在一起的,因为它们与map或{{1}一样}。

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

当您的地图功能没有副作用时,使用map可以涵盖您不需要懒惰的大多数情况,或者mapv当它是,但不是'返回一个结果。

如果您的地图功能都会产生结果并且副作用,并且您希望将这些结果收集在一起,那么您最好的选择是使用doseq而不是< em> map function ,通过名称以mapv结尾,明确产生副作用。虽然这不是!的很好用,但至少mapv清楚地突出了正在发生的事情。

答案 1 :(得分:3)

我会按照您的说法使用(doall (map ..)),因为很明显您的代码意图是什么。 mapv也有效,尽管意图有点模棱两可。