Scala MapSave用例
昨天我在SO发现了有关scala MapSave的信息: 我的问题是,什么时候有人想使用这种方法?提供的示例使用MapSave和identity函数,我看不到它的用例 编辑:对进行了快速搜索,找到了816个使用MapSave的Scala代码块。其中许多(至少3页)是这段代码:Scala MapSave用例,scala,functional-programming,Scala,Functional Programming,昨天我在SO发现了有关scala MapSave的信息: 我的问题是,什么时候有人想使用这种方法?提供的示例使用MapSave和identity函数,我看不到它的用例 编辑:对进行了快速搜索,找到了816个使用MapSave的Scala代码块。其中许多(至少3页)是这段代码: def checkStackOverflow() = { var xs: List[String] = Nil for (i <- 0 until 250000) xs = "
def checkStackOverflow() = {
var xs: List[String] = Nil
for (i <- 0 until 250000)
xs = "X" :: xs
val lowers = xs.mapConserve(_.toLowerCase)
assert(xs.mapConserve(x => x) eq xs)
}
def checkStackOverflow()={
var xs:List[String]=Nil
对于(i x)等式x)
}
这个问题引起了我的兴趣,所以我浏览了Scala代码库并了解了mapConserves()
的实际用途
出现在几个地方的一个例子是:如果参数是分部函数,则可以轻松跟踪映射操作是否进行了实际更改(通过简单的引用检查),如本例所示:
如果没有执行任何实际的更改,那么代码可以防止以后运行某种昂贵的操作。
使用常规map()
的用例的备选方案是
- …更昂贵[1]:迭代两个列表,然后比较它们的元素
- …非功能性:跟踪传递给
的部分函数是否通过改变某种外部标志->副作用而进行了更改,而不是纯粹的功能性操作方式;一般来说,我也很难看map()
[1] 当然,在给定的情况下,这是否重要取决于在优化之前的疑问度量。一般来说,这种方法现在似乎很少使用,这可能是一种赠品,它通常并不重要。正如文档所述:
map
和mapserve
之间的唯一区别是:在map
的情况下,总是创建一个新列表。对于mapcerve
,如果新生成的列表可能与原始列表相同,那么为什么不直接返回原始列表呢
def squashBoxed(tp: Type): Type = tp.dealiasWiden match {
case t @ RefinedType(parents, decls) =>
val parents1 = parents mapConserve squashBoxed
if (parents1 eq parents) tp
else RefinedType(parents1, decls)
// ...