【发布时间】:2015-01-27 15:03:32
【问题描述】:
我在 Scala-REPL 中输入了以下内容:
scala> List(1, 2, 3).toSet.subsets(2).map(_.toList)
res0: Iterator[List[Int]] = non-empty iterator
scala> List(1, 2, 3).toSet.subsets.map(_.toList)
<console>:8: error: missing parameter type for expanded function ((x$1) => x$1.toList)
List(1, 2, 3).toSet.subsets.map(_.toList)
为什么第二行出现错误?这是编译器中的错误还是我遗漏了什么?
【问题讨论】:
-
我猜
.subsets更加模棱两可(它可能是带有参数的版本的部分应用),因此类型推断效果不太好。在任何情况下,您都可以通过执行编译器告诉您的操作并提供显式类型来使其编译:List(1, 2, 3).toSet.subsets.map{x: Set[Int] => x.toList} -
但是这两个方法的返回类型签名相同,根据 2.10.4 scaladoc:
def subsets: Iterator[Set[A]],def subsets(len: Int): Iterator[Set[A]]所以就类型而言应该没有任何区别,对吧? -
在 Scala 中允许这些方法一起使用,而
def subsets(i: Int)(d: Double): Iterator[Set[A]]方法会导致ambiguous reference to overloaded definition错误,这不是不一致吗? -
如果是
Set(1, 2, 3).subsets,它可以工作。如果您将其与...subsets match { case x => x.map(_.toList) }分开,它也可以工作。 -
@the21st 的不对称性在于
subsets可以是subsets(Int)的部分应用,而subsets(2)不能是subsets的部分应用。 (但这只是一个猜测)。
标签: scala