gpt4 book ai didi

string - 理解 Scala 中的 String 和 map 方法

转载 作者:行者123 更新时间:2023-12-04 23:40:52 28 4
gpt4 key购买 nike

我编写了以下简单示例来了解 map 方法的工作原理:

object Main{
def main (args : Array[String]) = {
val test = "abc"
val t = Vector(97, 98, 99)
println(test.map(c => (c + 1))) //1 Vector(98, 99, 100)
println(test.map(c => (c + 1).toChar)) //2 bcd
println(t.map(i => (i + 1))) //3 Vector(98, 99, 100)
println(t.map(i => (i + 1).toChar)) //4 Vector(b, c, d)
};
}

我不太明白为什么 bcd 打印在 //2 .由于每个字符串都被 Scala 视为 Seq我以为 test.map(c => (c + 1).toChar)应该产生另一个 Seq .如 //1建议 Vector(b, c, d) .但正如你所看到的,它没有。为什么?它实际上是如何工作的?

最佳答案

这是 Scala 集合的一个特性(在这种情况下,字符串被视为字符集合)。真正的解释相当复杂,涉及对类型类的理解(我猜,这就是为什么在评论中提到 Haskell),但简单的解释是,嗯,并不难。

关键是,Scala 集合库的作者非常努力地避免代码重复。例如,map功能在 String实际上定义在这里:scala.collection.TraversableLike#map .另一方面,这种任务的天真方法会使 map返回 TraversableLike ,不是原版map被调用(它是 String )。这就是为什么他们提出了一种方法,可以避免代码重复和不必要的类型转换或过于笼统的返回类型。

基本上,Scala 集合方法如 map产生尽可能接近它被调用的类型的类型。这是使用名为 CanBuildFrom 的类型类实现的。 .完整签名map如下所示:

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That

有很多解释什么是类型类和 CanBuildFrom大约。我建议先看这里: http://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html#factoring-out-common-operations .另一个很好的解释在这里: Scala 2.8 CanBuildFrom

关于string - 理解 Scala 中的 String 和 map 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37995386/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com