Scala不处理':'函数的非显式类型闭包

sea*_*owg 4 compiler-construction types programming-languages functional-programming scala

所以基本上我想编写一个可以像这样编写的函数:

{ println(_) } =: thing
Run Code Online (Sandbox Code Playgroud)

在这里,我希望它真正做到thing.=:(println(_)).让我们说为了=:具有以下实现的论证:

def =:(block : Int => Any) {
    block(5)
}
Run Code Online (Sandbox Code Playgroud)

所以我试着用上面的方式调用它然后得到:

<console>:10: error: type mismatch;
   found   : Unit
   required: Int => Any
             println(_) =: thing
Run Code Online (Sandbox Code Playgroud)

然后我尝试这样做:

thing.=:(println(_))
Run Code Online (Sandbox Code Playgroud)

这样我就可以很好地5打印到终端了.然后我尝试了这个:

{ value => println(value) } =: thing
Run Code Online (Sandbox Code Playgroud)

这又失败了,告诉我有一个"缺少参数类型".我猜这是因为Scala尝试在这种情况下首先解析/编译函数参数,并且不会像它那样猜测类型(我在这里完全猜测),当它被称为更传统的方式时(使用点运算符).

任何人都可以更多地了解这里的问题,也可能建议一个最接近我原定目标的方法吗?

PS对这个标题抱歉.一旦我对问题有了更好的理解,我就会重命名.

Rex*_*err 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
Run Code Online (Sandbox Code Playgroud)

但如果您有许多可能的类型签名,这不是一个完全令人满意的解决方案,因为您必须将左侧的辅助方法名称与右侧的所需类型相匹配.