Scala 2.12中使用布尔通配符调用高阶函数为何出现编译错误?
问题原因解析
在Scala 2.12中,Vector.count方法的签名是def count(p: A => Boolean): Int,它要求传入一个接收A类型参数、返回Boolean值的谓词函数。
当你写v.count(_)时,编译器需要把_解析成符合Boolean => Boolean的函数(因为v是Vector[Boolean],A的类型为Boolean),也就是等价于x => x的函数。但Scala 2.12的类型推断器在这里无法完成自动推断,核心原因如下:
count的返回值是Int,该类型与传入的函数参数类型没有直接关联,编译器无法通过返回值反向推导函数参数的类型;- 单独的
_没有提供任何额外的类型线索,编译器无法确定它代表的是Boolean类型的参数。
而当你改成v.count(_ == true)时,函数体_ == true给了编译器明确的类型线索:只有Boolean类型的值才能和true进行相等比较,因此编译器可以立刻推断出占位符_的类型是Boolean,进而生成合法的Boolean => Boolean函数,代码也就可以正常编译了。
内容的提问来源于stack exchange,提问作者user79074
相关产品推荐
相关产品推荐

