Scala MapSave用例

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 = "

昨天我在SO发现了有关scala MapSave的信息:

我的问题是,什么时候有人想使用这种方法?提供的示例使用MapSave和identity函数,我看不到它的用例

编辑:对进行了快速搜索,找到了816个使用MapSave的Scala代码块。其中许多(至少3页)是这段代码:

  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)
  // ...