有点类似于 Stack Overflow 的问题Compose and andThen methods,我一直在学习 Twitter 的Scala School教程,并迅速遇到了与评论者相同的问题(这很棒,因为我睡觉之前认为我的问题已经解决了)。
在教程中,它将两种方法定义如下:
很好。问题在于,虽然不能组合方法有一定道理,但当我对我知道会评估为
在教程中,它将两种方法定义如下:
def addUmm(x: String) = x + " umm"
def addAhem(x: String) = x + " ahem"
在较新版本的Scala中,您不能像这样调用它们的compose:addUmm(_).compose(addAhem(_))
,但是接受的答案(以及一些其他答案似乎依赖于addUmm
和addAhem
是方法而不是函数,这在尝试调用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 新手来说,推断器无论你是否在两个位置显式指定 _: String
,都会错误地得出 a(_).compose(b(_))
,但 a.compose(b)
不会,这有些令人困惑。