1

看起来很奇怪,但这不起作用:

scala> (1 to 6).toSet map (_ / 2)
<console>:8: error: missing parameter type for expanded function ((x$1) => x$1.$div(2))
              (1 to 6).toSet map (_ / 2)
                                  ^

但是,使用to[Set]而不是toSet

scala> (1 to 6).to[Set] map (_ / 2)
res0: scala.collection.immutable.Set[Int] = Set(2, 0, 3, 1)

嗯。o_O

还要考虑这可行:

scala> val s = (1 to 6).toSet; s map (_ / 2)
s: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4)
res1: scala.collection.immutable.Set[Int] = Set(2, 0, 3, 1)

正如Range.Inclusive@AlexIv 所建议的一阶类型,请记住,这也不适用于List[Int]

scala> List(1, 2, 3, 4, 5, 6).toSet map (_ / 2)
<console>:8: error: missing parameter type for expanded function ((x$1) => x$1.$
div(2))
              List(1, 2, 3, 4, 5, 6).toSet map (_ / 2)
                                                ^

和以前一样,这有效:

scala> val s = List[Int](1, 2, 3, 4, 5, 6).toSet; s map (_ / 2)
s: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4)
res3: scala.collection.immutable.Set[Int] = Set(2, 0, 3, 1)

编辑:在使用 .toSet 制作的 Set 上重复类型推断失败?

4

1 回答 1

1

打字机阶段 ( scala -Xprint:typer) 隐藏了答案:

private[this] val res7: <error> = Predef.intWrapper(1).to(6).toSet[B].map[B, That]({
  ((x: Nothing) => Predef.identity[Nothing](x))
})();

(1 to 6)返回一个 Range.Inclusive,它是一阶类型而不是类型构造函数,它没有参数化,但Set[A]期望/要求您为其提供某种类型并返回一个类型。当您调用时toSet, scalac 需要某种类型,因为Inclusive没有toSet方法,它继承自TraversableOnce并且是泛型方法,因此您需要显式提供某种类型:

(1 to 6).toSet[Int].map(identity)
res0: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4)

toBuffer也不起作用,其他转换工作完美,这两种方法具有相似的实现:

def toBuffer[B >: A]: mutable.Buffer[B] = to[ArrayBuffer].asInstanceOf[mutable.Buffer[B]]

def toSet[B >: A]: immutable.Set[B] = to[immutable.Set].asInstanceOf[immutable.Set[B]]
于 2013-10-20T22:22:17.347 回答