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

0__*_*0__ 7 generics scala overloading type-inference

我在我的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.
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

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

beta(_.toString)  // ok
beta("gaga")      // ok
Run Code Online (Sandbox Code Playgroud)

Dan*_*ral 4

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

def beta[ T ]( thunk: => T ) : String = thunk.toString
Run Code Online (Sandbox Code Playgroud)

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

scala> beta((_: Int) + 1)
res0: String = <function1>
Run Code Online (Sandbox Code Playgroud)

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

scala> beta((_: String) + 11)
res1: String = <function1>
Run Code Online (Sandbox Code Playgroud)

Scala 如何假设它是一个Int?您所展示的用于演示重载的示例不应该受到指责,因此没有演示任何此类内容,因为您删除了其中的类型参数。