为什么可以写柯里化?

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)

  }
}

如你所见,可以写成柯里化版本,另一个写成方法调用。为什么可能?

contramapreturns一个Show实例。

Show 同时具有 showapply 方法。

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)