T): String = fun(33).toString def -6ren">
gpt4 book ai didi

generics - "Missing parameter type"在采用函数参数的重载泛型方法中

转载 作者:行者123 更新时间:2023-12-04 12:24:33 26 4
gpt4 key购买 nike

我在我的 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 ?您展示的用于演示重载的示例并没有说明任何此类事情,因为您摆脱了其中的类型参数。

关于generics - "Missing parameter type"在采用函数参数的重载泛型方法中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6448444/

26 4 0