有点类似于 Stack Overflow 问题Compose 和 andThen methods,我一直在研究 Twitter 的Scala School教程,并很快遇到了评论者遇到的同样问题(这很棒,因为我上床睡觉时以为我的问题已经解决了)。
在本教程中,它定义了两种方法:
def addUmm(x: String) = x + " umm"
def addAhem(x: String) = x + " ahem"
而在较新版本的 Scala 中,您不能像这样调用 compose: addUmm(_).compose(addAhem(_))
,接受的答案(以及其他一些答案似乎取决于addUmm
andaddAhem
是方法而不是函数的事实,这在尝试时会产生问题调用 compose. 我满意地上床睡觉,成功运行:
scala> ((s: String) => s + " umm").compose((s: String) => s + " ahem")
res0: String => java.lang.String = <function1>
凉爽的。问题是,虽然不能编写方法是有道理的,但当我用我知道的值评估相同的东西时Function1
:
val a = (s: String) => s + " umm"
val b = (s: String) => s + " ahem"
val c = a(_).compose(b(_))
好吧,最后一行出现了与原始问题相同的错误,尽管这次它们是函数的部分应用,而不是方法。原始问题中的一个答案(排名靠前,但不是公认的答案)似乎暗示它与部分应用程序的扩展方式有关,解释是什么?
对于 Scala 新手来说,a(_).compose(b(_))
无论您是否明确指定_: String
这两个地方,推理器都会出错,但a.compose(b)
确实有点令人困惑。