Scala mapConserve用例

时间:2016-09-21 10:10:14

标签: scala functional-programming

昨天我在SO:scala List map vs mapConserve

找到了关于scala mapConserve的信息

我的问题是,有人想什么时候使用这种方法?提供的示例使用带有标识功能的mapConserve,我看不到它的用例......

编辑GitHub进行了快速搜索,找到了使用mapConserve的816个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)
  }

1 个答案:

答案 0 :(得分:3)

这个问题引起了我的兴趣,所以我浏览了Scala代码库并查看了mapConserves()实际用途。

在一些地方弹出的是:如果参数是部分函数,​​则轻松跟踪地图操作是否已经进行了实际更改(通过简单的参考检查),如Erasure中的示例所示:

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

如果没有执行实际更改,则代码可以防止之后运行某种昂贵的操作。 具有常规map()的该用例的替代方案是..

  • ..更贵[1]:迭代两个列表并在之后比较其元素
  • ..不起作用:在传递给map()的部分函数内跟踪是否通过改变某种外部标记进行更改 - &gt;副作用,不是纯粹的,不是功能性的做事方式;一般而言,imho非常丑陋

[1]在特定情况下这是否显着取决于当然,在您优化之前,通常会有疑问。一般来说,这种方法现在似乎较少使用,这可能是一种通常并不重要的赠品。