gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:18:19 27 4
gpt4 key购买 nike

以下代码无法编译:

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

为什么编译器不能在这里推断 String 类型?是否存在某种歧义?

一般来说,是否可以手动检查和检查下划线扩展生成的代码?

最佳答案

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

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

血腥的细节,如果你想要的话,在 http://scala-lang.org/files/archive/spec/2.11/06-expressions.html ,第 6.6、6.23 和 6.26.4 段。

关于Scala 缺少扩展函数的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38611092/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com