繁体   English   中英

采用函数参数的重载泛型方法中的“缺少参数类型”

[英]“Missing parameter type” in overloaded generic method taking a function argument

我在我的DSL中遇到问题,重载泛型方法导致编译器希望我添加显式参数类型:

def alpha[T](fun: Int => T): String = fun(33).toString

def beta [T](fun: Int => T): String = fun(66).toString
def beta [T](thunk:   => T): String = thunk.toString

alpha { _ + 11 }          // ok
beta { _ + 22 }           // "error: missing parameter type for expanded function"
beta { _: Int => _ + 22 } // ok... ouch.

我有可能摆脱最后一行的混乱局面吗?

编辑:

为了证明重载不是scalac本身的歧义问题,这里是一个没有类型参数的版本,它可以很好地工作:

def beta(fun: Int => String): String = fun(66).reverse
def beta(thunk:   => String): String = thunk.reverse

beta(_.toString)  // ok
beta("gaga")      // ok

问题是Int => T也是一种类型。 例如,假设您仅定义了第二个beta

def beta[ T ]( thunk: => T ) : String = thunk.toString

现在你将函数Int => Int传递给它:

scala> beta((_: Int) + 1)
res0: String = <function1>

所以,假设函数适合=> T ,并且你还有一个Int => T ,那么Scala应该知道你想要哪一个? 它可以是一个String ,例如:

scala> beta((_: String) + 11)
res1: String = <function1>

Scala怎么会认为它是一个Int 你所展示的示例过载的例子并不是责备不要展示任何这样的东西,因为你摆脱了它们中的类型参数。

您可能已经意识到,问题出现是因为您的beta函数已经过载。 当你定义:

beta { _ + 22 }

你期望它打电话给哪个beta? Scala不能知道_Int是因为你用22求和它。所以对于这个特例,你必须定义_是什么。

暂无
暂无

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

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