3

为什么以下代码有效?

scala> List(1,2,3) map "somestring"
res0: List[Char] = List(o, m, e)

它适用于 2.9 和 2.10。查看打字机:

[master●●] % scala -Xprint:typer -e 'List(1,2,3) map "somestring"'                                                                                ~/home/folone/backend
[[syntax trees at end of                     typer]] // scalacmd2632231162205778968.scala
package <empty> {
  object Main extends scala.AnyRef {
    def <init>(): Main.type = {
      Main.super.<init>();
      ()
    };
    def main(argv: Array[String]): Unit = {
      val args: Array[String] = argv;
      {
        final class $anon extends scala.AnyRef {
          def <init>(): anonymous class $anon = {
            $anon.super.<init>();
            ()
          };
          immutable.this.List.apply[Int](1, 2, 3).map[Char, List[Char]](scala.this.Predef.wrapString("somestring"))(immutable.this.List.canBuildFrom[Char])
        };
        {
          new $anon();
          ()
        }
      }
    }
  }
}

看起来它被转换为WrappedString具有 apply 方法的 。这解释了它是如何工作的,但没有解释 a 如何WrappedString被接受为类型参数A => B(如scaladoc中所指定)。有人可以解释一下,这是怎么发生的,好吗?

4

3 回答 3

7

通过collection.Seq[Char], 这是 的子类型PartialFunction[Int, Char], 是 的子类型Int => Char

scala> implicitly[collection.immutable.WrappedString <:< (Int => Char)]
res0: <:<[scala.collection.immutable.WrappedString,Int => Char] = <function1>

所以只有一个隐式转换发生——原始的String => WrappedString,因为我们把一个字符串当作一个函数来对待。

于 2013-03-15T13:27:45.783 回答
4

因为WrappedString有作为超类型(Int) => Char

Scaladoc并展开“线性超类型”部分。

于 2013-03-15T13:27:53.330 回答
2

其他人已经明确表示您的 String 实现了一个接受 Int 并返回 char 的函数(即 Int=>Char 表示法)。这允许这样的代码:

scala> "Word".apply(3)
res3: Char = d

扩展您的示例将使其更加清晰,也许:

List(1,2,3).map(index => "somestring".apply(index))
List(1,2,3).map(index => "somestring"(index)) //(shorter, Scala doesn't require the apply)
List(1,2,3).map("somestring"(_)) //(shorter, Scala doesn't require you to name the value passed in to map) 
List(1,2,3).map("somestring") //(shorter, Scala doesn't require you to explicitly pass the argmument if you give it a single-arg function) 
于 2013-03-15T13:34:55.487 回答