所以基本上我想写一个可以写成这样的函数:
{ 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尝试在这种情况下首先解析/编译函数参数,并且不会像它那样猜测类型(我在这里完全猜测)当它被称为更传统的方式时(使用点运算符)。
有没有人可以更多地了解这里的问题,也许可以建议实现接近我原定目标的最好方法?
P.S。抱歉,标题。一旦我对问题有了更好的理解,我就会重命名。
答案 0 :(得分:6)
类型推断从左到右工作,即使#:
形式的符号方法名称最终从右向左工作。如果实际上只有一种类型,则可以使用辅助方法:
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
但如果您有许多可能的类型签名,这不是一个完全令人满意的解决方案,因为您必须将左侧的辅助方法名称与右侧所需的类型相匹配。
答案 1 :(得分:1)
那么为什么不添加参数类型:
{ value:Int => println(value) } =: thing
我自己不是Scala专家所以我无法更深入地解释推理器无法推断的内容。