繁体   English   中英

Scala:缺少参数类型

[英]Scala: missing parameter type

我在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)

为什么我在第二行遇到错误? 这是编译器中的错误还是我遗漏了什么?

这很可能是一个编译器问题本身,它无法进行类型推断。 我以前遇到过类似的问题。

如果你快速查看Set 子集()子集(len:Int)的定义,它们共享相同的返回类型,所以它们都应该工作,对吧?

要解决这个问题,这将有效:

(List(1, 2, 3).toSet.subsets: Iterator[Set[Int]]).map(_.toList)

奇怪的是,第一个版本的作品,因为subsets的应用subsets(2)是,因为它是,超过暧昧无括号。

因为该方法被重载,所以在应用程序中,编译器暂停以求解toSetB结果,并确定BInt 因此它知道map预期参数类型。

在没有parens的版本中,带参数列表的方法不是候选者,因为不会触发eta-expansion。 因此,当它键入map应用程序时,它没有得出关于B任何结论, B是映射函数的输入类型。

简单的解决方法是告诉它演绎B

trait Test {
  def f1 = List(1, 2, 3).to[Set].subsets.map(_.toList) // instead of .toSet
  def f2 = List(1, 2, 3).toSet.subsets(2).map(_.toList)
}

原始代码上-Ytyper-debug的输出显示了重载决策如何进行类型推断:

|    |    |    |    |    |    \-> => Iterator[scala.collection.immutable.Set[B]] <and> (len: Int)Iterator[scala.collection.immutable.Set[B]]
|    |    |    |    |    solving for (B: ?B)
|    |    |    |    |    |-- 2 : pt=Int BYVALmode-EXPRmode-POLYmode (silent: method f2 in Test) 
|    |    |    |    |    |    \-> Int(2)
|    |    |    |    |    solving for (B: ?B)
|    |    |    |    |    \-> Iterator[scala.collection.immutable.Set[Int]]

另一种解决方法是通过扩展方法:

scala> implicit class ss[A](val s: Set[A]) { def ss(n: Int) = s subsets n ; def ss = s.subsets }
defined class ss

scala> List(1, 2, 3).toSet.ss.map(_.toList)
res1: Iterator[List[Int]] = non-empty iterator

让我们看看他们是否会改变图书馆:

https://github.com/scala/scala/pull/4270

子集可以部分应用其他过载。

这似乎是一个编译器问题。

相比:

scala> List(1,2,3).toSet.subsets
res4: Iterator[scala.collection.immutable.Set[Int]] = non-empty iterator

scala> res4.map(_.toList)
res5: Iterator[List[Int]] = non-empty iterator

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM