在创建字符串到部分函数的映射时,我遇到了意外的行为。当我创建一个部分函数作为地图元素时,它工作正常。当我分配给 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 
}
有帮助吗?

解决方案

为了方便起见,Scala可以让您在调用方法时省略空的帕伦斯,但它足够聪明,可以看到第一种情况下的预期类型 ()=>Unit, ,因此它不会为您删除所有帕伦斯;相反,它将方法转换为您的函数。

在里面 val check 但是,看起来就像将函数调用结果分配给变量一样。实际上,这三个都做得完全相同:

val check = dream
val check = dream()
val check = dream()()

如果要将方法转换为函数,请放置 _ 方法之后 代替参数列表. 。因此,

val check = dream() _

会做你想做的。

其他提示

好吧,问题是你全都错了。:-)

以下是一些概念性错误:

def dream()() = {
    println("~Dream~");
    new Exception().printStackTrace()
}

这不是部分函数。这是一个带有两个空参数列表的柯里化方法,它返回 Unit.

val map = scala.collection.mutable.HashMap[String,()=>Unit]()

该映射中值的类型不是偏函数,而是函数。具体来说, Function0[Unit]. 。偏函数有类型 PartialFunction[T, R].

map("dream") = dream()      // partial function

这里发生的是 Scala 皈依者 将部分应用的方法转化为函数。这不是一个简单的任务。Scala 会进行转换,因为类型推断器可以猜测正确的类型。

val check = dream()         // unexpected invocation

这里没有预期的类型可以帮助类型推断器。但是,可以省略空参数列表,因此这只是一个方法调用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top