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

时间:2011-10-18 00:12:39

标签: scala compiler-construction types programming-languages functional-programming

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

{ 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。抱歉,标题。一旦我对问题有了更好的理解,我就会重命名。

2 个答案:

答案 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专家所以我无法更深入地解释推理器无法推断的内容。