2017-09-13 18 views
3

这种精细编译:为什么用作默认参数的函数字面量需要参数类型?

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

的错误是:

Error:(1, 38) missing parameter type

明显w^orkaround是使用(_: X) => true,但为什么这是一个错误?我虽然认为当第二个参数列表正在处理时,从第一个参数获得的类型信息应该已经可用了?

测试使用Scala 2.11.8和2.12.1

+0

哎呀我不小心删除我的评论:) OK呀,我意识到了,但是请不要编辑它强调的问题(甚至更好,完全删除这些行,问题是在定义中,不是调用) – slouc

回答

2

貌似this issue。请注意,这仅适用于默认参数;其他地方的推论工作得很好。

例如,

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

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