为什么可以写出currying?

时间:2018-02-09 10:36:29

标签: scala scala-cats

我有以下代码:

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)

  }
}

正如您所看到的,可以将其作为currying版本编写,将另一个编写为方法调用。为什么有可能?

1 个答案:

答案 0 :(得分:4)

contramap会返回Show个实例。

Show同时包含showapply方法。

apply方法在Scala中很特殊,因为这两个方法是等价的:

someValue.apply(someArg)
someValue(someArg)

因此,在您的示例中,您正在调用apply返回的Show实例上的contramap方法,即

val m = showString.contramap[Symbol](_.name).show('dave)
val a = showString.contramap[Symbol](_.name).apply('dave)

更新

虽然上面的解释是有道理的,但我意识到猫的Show没有apply方法,所以你的代码不应该编译(我试过REPL而不是)