人们说避免使用map
来执行序列的副作用,这是有道理的。
但在现实世界中,我发现自己需要保留结果并急切地评估map
,即在插入db并返回记录时。
(doall (map ..))
是我唯一的选择吗?有没有更惯用的方法呢?
答案 0 :(得分:5)
没有。 (doall (map ..))
不是您唯一的选择:mapv
不是懒惰的,所以它有效地(doall (map ..))
,但是在一次操作中。
将map
或mapv
用于产生副作用的地图功能并不是很好。而是尝试使用doseq
,这清楚地表明会发生副作用。正如您所指出的那样,问题就在于问题的关键,doseq
的问题在于,返回结果不是按顺序收集在一起的,因为它们与map
或{{1}一样}。
如果你不想要一个懒惰的序列,那么首先尝试不生成它,而不是生成它,然后强制它像你现在一样实现。因此,我们应该排除使用mapv
。
当您的地图功能没有副作用时,使用map
可以涵盖您不需要懒惰的大多数情况,或者mapv
当它是,但不是'返回一个结果。
如果您的地图功能都会产生结果并且副作用,并且您希望将这些结果收集在一起,那么您最好的选择是使用doseq
而不是< em> map function ,通过名称以mapv
结尾,明确产生副作用。虽然这不是!
的很好用,但至少mapv
清楚地突出了正在发生的事情。
答案 1 :(得分:3)
我会按照您的说法使用(doall (map ..))
,因为很明显您的代码意图是什么。 mapv
也有效,尽管意图有点模棱两可。