人们说避免使用map
顺序执行副作用,这是有道理的.
但在现实世界中,我发现自己需要保留结果并map
急切地评估,即插入数据库并返回记录时.
这是(doall (map ..))
我唯一的选择吗?有没有比较惯用的方法呢?
号(doall (map ..))
是不是你唯一的选择:mapv
是不是懒惰,所以它确实有效(doall (map ..))
,但在一个操作.
这是不是很大为使用map
或mapv
使用地图功能产生副作用.而是尝试使用doseq
,这清楚地表明将发生副作用.正如你所指出的,这就是问题的症结所在,问题doseq
在于返回结果不是按顺序聚集在一起,因为它们是map
或者mapv
.
如果你不想要一个懒惰的序列,那么首先尝试不生成它,而不是生成它,然后强制它像你现在一样实现.因此我们应该排除使用map
.
大多数不需要懒惰的情况可以通过mapv
在地图功能没有副作用时使用,或者doseq
在没有返回结果的情况下使用.
如果你的地图功能都产生了结果,并且是副作用,并且你希望将这些结果收集在一起,那么你最好的选择就是使用mapv
一个名为明显产生副作用的地图功能,通过名字结束在!
.虽然这不是很好用mapv
,但至少!
清楚地突出了正在发生的事情.