为什么用作默认参数的函数文字需要参数类型?

时间:2017-09-13 10:41:23

标签: scala function generics type-inference

编译好:

def walk[X](a: X)(f: X => Boolean): Boolean =  f(a)

walk(1)(_ => true)

此编译也很好:

def walk(a: Int)(f: Int => Boolean = _ => true): Boolean =  f(a)

walk(1)()

这不是:

def walk[X](a: X)(f: X => Boolean = _ => true): Boolean = f(a)

walk(1)()

错误是:

  

错误:(1,38)缺少参数类型

明显的解决方法是使用(_: X) => true,但为什么这是一个错误?我虽然在处理第二个参数列表时,从第一个参数列表中获取的类型信息应该已经可用了吗?

使用Scala 2.11.8和2.12.1进行测试

1 个答案:

答案 0 :(得分:2)

看起来像this issue。请注意,仅适用于默认参数;推理工作得很好。

例如,

// works
def walk1[X]: X => Boolean = _ => true

// fails
def walk2[X](f: X => Boolean = _ => true) = ???