Scala 为什么写咖喱语是可能的?

Scala 为什么写咖喱语是可能的?,scala,scala-cats,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) } } 正如您所看到的,可以编写为curry版本

我有以下代码:

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)

  }
}
正如您所看到的,可以编写为curry版本,另一个编写为方法调用。为什么可能

contramap返回一个Show实例

Show同时具有Show和apply方法

apply方法在Scala中是特殊的,因为这两种方法是等效的:

someValue.apply(someArg)
someValue(someArg)
在您的示例中,您正在对contramap返回的Show实例调用apply方法,即

使现代化
虽然上面的解释是有道理的,但我意识到cats的Show没有apply方法,因此您的代码不应该编译。我在REPL上尝试过,它不知道为什么has类型字符串没有显示[Symbol]?查看def apply[A]隐式实例:Show[A]:Show[A]=实例返回一个Show[A]实例而不是字符串。@Gabrieleptronella但似乎没有apply方法?@Andreytukin现在没有。它曾经在以前版本的猫中有过,这很可能就是OPusing@zero_coding您看到的是Show companion对象上的apply方法,而不是实例上的apply方法。cats的最新版本甚至没有实例上的apply方法,因此您的代码可能无法在cats1下编译。0@GabrielePetronella嗯,对不起,我还是不太满意这个解释。我还没有正确地将《猫》的历史一分为二,但对2015年至2017年期间的提交进行简要扫描后,并没有发现任何版本的《猫》在哪个版本中有应用?您能否指定一个特定的版本,在该版本中不需要额外的隐式转换就可以工作?您能否添加您正在使用的所有导入?我的cats 1.0.1给了我一个错误:cats.Show[Symbol]不接受参数,因为Show似乎没有应用方法……请您也添加有关您正在使用的特定版本的信息,好吗?它不仅没有在1.0.1中编译,而且我也找不到任何编译它的版本。
val m = showString.contramap[Symbol](_.name).show('dave)
val a = showString.contramap[Symbol](_.name).apply('dave)