所以基本上我想写一个可以这样写的函数:
{ println(_) } =: thing
在这里我希望它能够真正做到
thing.=:(println(_))
。为了便于论证,我们可以说 =:
具有以下实现:
def =:(block : Int => Any) {
block(5)
}
所以我尝试用上面的方式调用它,我得到:
<console>:10: error: type mismatch;
found : Unit
required: Int => Any
println(_) =: thing
然后我尝试这样做:
thing.=:(println(_))
这样我就可以在终端上打印出漂亮的
5
。然后我尝试了这个:
{ value => println(value) } =: thing
这再次失败并告诉我有一个“缺少参数类型”。我猜测这是因为 Scala 在这种情况下首先尝试解析/编译函数参数,并且当它被称为更传统的方式(使用点运算符)。
任何人都可以更清楚地说明这里的问题,并且还可以建议实现接近我最初目标的最佳方法吗?
附注对不起这个标题。一旦我更好地理解了问题,我就会重命名它。
类型推断从左到右工作,即使
#:
形式的符号方法名称最终从右到左工作。 如果您实际上只有一种类型,则可以使用辅助方法:
def let(fi: Int => Any) = fi
case class Thing(i: Int) {
def =:(f: Int => Any) = f(i)
}
scala> let(_+2) =: Thing(5)
res4: Any = 7
但是,如果您有许多可能的类型签名,这并不是一个完全令人满意的解决方案,因为您必须将左侧的帮助器方法名称与右侧所需的类型相匹配。
那么为什么不添加参数类型:
{ value:Int => println(value) } =: thing
我自己不是 Scala 专家,因此我无法对推理器可以推理什么和不能推理什么提供更深入的解释。