【发布时间】:2015-02-28 19:06:37
【问题描述】:
List Comprehension 和 lists:map/2 之间的效果,根据我的测试,后者的性能似乎更好。
参考效率指南中有关列表理解的链接 用户指南:http://www.erlang.org/doc/efficiency_guide/listHandling.html#id66810
它说“如果列表推导的结果显然不会被使用,则不会构造列表。”
问题:我想知道 list:map/2 的结果是否不使用(如 lists:foreach/2),它是否与列表理解一样 " 列表将不被建造” ??
【问题讨论】:
-
首先,您为什么要编写代码以使您无法判断是否使用了对
lists:map/2的调用结果?其次,我认为您对这种微优化的关注是错误的。 -
@SteveVinoski 这触及了我一直想解决的一个歧义点——以某种方式迭代列表之间的区别,专门针对这样做的副作用,而不是接收返回值。如果我们有一个 lists:map 或其他形式的列表理解,用于副作用而不是“价值构建,或者可能是副作用”,那么
ok | {error, {Index, Reason}}可能是适当的返回类型,而不是未使用的列表,所以我们可以使用断言或错误类型代码,而不是让这种情况模棱两可。 -
编译器或运行时如何知道这样的调用是否发生了副作用?
-
@SteveVinoski ,我知道如何使用它们,我刚刚阅读了效率指南用户指南并提出了这个问题。
-
lists:foreach/2用于副作用,因为它从不构建值列表并返回ok。
标签: erlang