0

阅读此问题后,我希望以下内容可以正常工作:

Seq( Seq(1,2,3) , Seq(4,5,6) ).transpose()

可惜:

error: not enough arguments for method transpose: (implicit asTraversable: 
Seq[Int] => scala.collection.GenTraversableOnce[B])Seq[Seq[B]].
Unspecified value parameter asTraversable.
          Seq( Seq(1,2,3) , Seq(4,5,6) ).transpose()

另外,我似乎在 scala docs 上找不到任何转置的参考,尽管Seq 引用了它

提供身份,它似乎以某种方式工作:

scala> Seq( Seq(1,2,3) , Seq(4,5,6) ).transpose( a => a)
res10: Seq[Seq[Int]] = List(List(1, 4), List(2, 5), List(3, 6))

但仍然返回 List 而不是 Seq

4

1 回答 1

4

不用括号直接使用:

Seq( Seq(1,2,3) , Seq(4,5,6) ).transpose
//res0: Seq[Seq[Int]] = List(List(1, 4), List(2, 5), List(3, 6))

但仍然返回 List 而不是 Seq

好吧,实际上List 是 Seq 的继承者,所以毕竟你得到了一个 Seq (查看结果的左侧部分)。

这种行为的原因是 transpose 实际上定义为参数的函数,但由于它的参数定义为隐式,您可以选择将替换参数的工作委托给 scala 编译器(它将为您执行编译时查找)。

如果您编写括号,则任何一个函数都必须具有不带参数的重载形式,例如

def transpose() = ...

或者你必须在其中写一些东西(这实际上是语法问题)。

于 2012-11-23T13:32:05.783 回答