Fre*_*lam 8 functional-programming scala function partial-application partialfunction
在为部分函数创建String映射时,我遇到了意外行为.当我创建一个部分函数作为地图元素时,它工作正常.当我分配给val时,它会调用.尝试调用检查会生成错误.这是预期的吗?我在做一些蠢事吗?注释掉check()以查看调用.我正在使用scala 2.7.7
def PartialFunctionProblem() = {
def dream()() = {
println("~Dream~");
new Exception().printStackTrace()
}
val map = scala.collection.mutable.HashMap[String,()=>Unit]()
map("dream") = dream() // partial function
map("dream")() // invokes as expected
val check = dream() // unexpected invocation
check() // error: check of type Unit does not take parameters
}
Run Code Online (Sandbox Code Playgroud)
Rex*_*err 12
为方便起见,Scala允许您在调用方法时省略空的parens,但是它足够聪明,可以看到第一种情况下的预期类型()=>Unit,因此它不会为您删除所有的parens; 相反,它将方法转换为一个函数.
val check但是,在这种情况下,它看起来就像一个函数调用结果被分配给一个变量.事实上,所有这三个都完全相同:
val check = dream
val check = dream()
val check = dream()()
Run Code Online (Sandbox Code Playgroud)
如果要将方法转换为函数,请_在方法之后放置参数列表.从而,
val check = dream() _
Run Code Online (Sandbox Code Playgroud)
会做你想做的.
好吧,问题是你弄错了.:-)
以下是一些概念性错误:
def dream()() = {
println("~Dream~");
new Exception().printStackTrace()
}
Run Code Online (Sandbox Code Playgroud)
这不是部分功能.这是一个curried方法,有两个返回的空参数列表Unit.
val map = scala.collection.mutable.HashMap[String,()=>Unit]()
Run Code Online (Sandbox Code Playgroud)
此映射中的值的类型不是部分函数,而是函数.具体来说,Function0[Unit].部分函数将具有类型PartialFunction[T, R].
map("dream") = dream() // partial function
Run Code Online (Sandbox Code Playgroud)
这里发生的是Scala 将部分应用的方法转换为函数.这不是一个简单的任务.Scala执行转换,因为类型推断器可以猜出正确的类型.
val check = dream() // unexpected invocation
Run Code Online (Sandbox Code Playgroud)
这里没有预期的类型来帮助类型推理器.但是,可以省略空参数列表,因此这只是一个方法调用.