【发布时间】:2011-12-02 18:12:34
【问题描述】:
有点类似于 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) 确实有点令人困惑。
【问题讨论】:
-
如果使用 lambdas 的下划线快捷方式无法正常工作,请先使用正常语法尝试。下划线的行为经常出乎意料。
-
您应该在该问题中阅读my answer。我准确地解释了该行的问题所在,它与方法/功能的区别不有关。
-
@DanielC.Sobral 你的答案实际上是我引用的答案(排名靠前的那个)(并且很久以前就赞成你的答案:))。我抱怨的那句话似乎是那个问题的核心,所以接受的答案(正如你所指出的那样)似乎是一条红鲱鱼。我只是想在这里考虑一下。
标签: scala function-composition