繁体   English   中英

Scala缺少扩展函数的参数类型

[英]Scala missing parameter type for expanded function

以下代码无法编译:

def f[T](conv: Option[String => T]) {}
f(Some(_.toInt))

使用<console>:13: error: missing parameter type for expanded function ((x$1) => x$1.toInt)

当然,显式类型使它很好:

scala> f(Some((x: String) => x.toInt))

为什么编译器不能在这里推断字符串类型? 有某种歧义吗?

通常,是否可以通过下划线扩展手动检查和检查生成的代码?

基本问题(我相信)是当键入Some(_.toInt) ,编译器需要推断Some.apply[A](x: A)的类型参数, Some.apply[A](x: A) ,首先需要对类型参数进行类型检查。参数。 所以_.toIntA (被认为是未知类型常量)作为预期类型进行了类型检查。 这失败了,因为当预期类型是函数类型时(或者从Scala 2.12开始,单个抽象方法类型),只允许匿名函数不指定参数类型。 然后编译器再次尝试将undefined作为预期类型,并因同样的原因而失败。

在这种情况下,预期的返回类型实际上足以确定类型参数,然后这将允许类型_.toInt ,但这不是它的设计工作方式。

如果您需要,可以在http://scala-lang.org/files/archive/spec/2.11/06-expressions.html ,第6.6,6.23和6.26.4段中查看详细信息。

暂无
暂无

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

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