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对这个标题抱歉.一旦我对问题有了更好的理解,我就会重命名.
类型推断从左到右工作,即使#:
表单的符号方法名称最终从右向左工作.如果实际上只有一种类型,则可以使用辅助方法:
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)
但如果您有许多可能的类型签名,这不是一个完全令人满意的解决方案,因为您必须将左侧的辅助方法名称与右侧的所需类型相匹配.