scala - 什么时候 scala 偏函数不是偏函数?

标签 scala function functional-programming partial-application partialfunction

在创建 String 到部分函数的映射时,我遇到了意外行为。当我创建一个部分函数作为 map 元素时,它工作正常。当我分配给一个 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() _

会做你想做的。

关于scala - 什么时候 scala 偏函数不是偏函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2871028/

相关文章:

Python 相当于 Scala 的 exists() 函数?

scala - 在 Scala 中使用 self 类型时如何保持单一责任?

scala - 使用 'value: Type' 语法自动转换类型

Python - 如何将 IF 语句转换为函数以使用其他字符串多次调用?

c - 错误 : format %d expects type int, 但参数 2 的类型为 double(*)(int, int)

functional-programming - 在 Erlang 中同时绑定(bind)元组及其解构元素

scala - 试图理解“Scala 中的最终抽象类 Int private 扩展 AnyVal

python - 将属性分配给特定的函数实例

Haskell 类型表示另一种类型的子集

clojure - 什么是 Clojure 中的生成测试?