为什么可以写柯里化?
Why it is possible to write currying?
我有以下代码:
object ContraCats {
val showString = Show[String]
def main(args: Array[String]): Unit = {
val m = showString.contramap[Symbol](_.name).show('dave)
val a = showString.contramap[Symbol](_.name)('dave)
}
}
如你所见,可以写成柯里化版本,另一个写成方法调用。为什么可能?
contramap
returns一个Show
实例。
Show
同时具有 show
和 apply
方法。
apply
方法在 Scala 中是特殊的,因为这两个是等价的:
someValue.apply(someArg)
someValue(someArg)
所以在您的示例中,您正在调用 contramap
返回的 Show
实例上的 apply
方法,即
val m = showString.contramap[Symbol](_.name).show('dave)
val a = showString.contramap[Symbol](_.name).apply('dave)
更新
虽然上面的解释是有道理的,但我意识到猫的 Show
没有 apply
方法,所以你的代码不应该编译(我试过 REPL 但它没有' t)
我有以下代码:
object ContraCats {
val showString = Show[String]
def main(args: Array[String]): Unit = {
val m = showString.contramap[Symbol](_.name).show('dave)
val a = showString.contramap[Symbol](_.name)('dave)
}
}
如你所见,可以写成柯里化版本,另一个写成方法调用。为什么可能?
contramap
returns一个Show
实例。
Show
同时具有 show
和 apply
方法。
apply
方法在 Scala 中是特殊的,因为这两个是等价的:
someValue.apply(someArg)
someValue(someArg)
所以在您的示例中,您正在调用 contramap
返回的 Show
实例上的 apply
方法,即
val m = showString.contramap[Symbol](_.name).show('dave)
val a = showString.contramap[Symbol](_.name).apply('dave)
更新
虽然上面的解释是有道理的,但我意识到猫的 Show
没有 apply
方法,所以你的代码不应该编译(我试过 REPL 但它没有' t)