gpt4 book ai didi

scala - Scala 中方法、函数和部分应用函数的函数组合

转载 作者:行者123 更新时间:2023-12-03 13:55:22 25 4
gpt4 key购买 nike

有点类似于 Stack Overflow 问题 Compose and andThen methods ,我一直在使用 Twitter 的 Scala School教程并很快遇到了评论者遇到的相同问题(这很棒,因为我上床 sleep 时以为我的问题已经解决了)。

在本教程中,它定义了两种方法:

def addUmm(x: String) = x + " umm"
def addAhem(x: String) = x + " ahem"

而在较新版本的 Scala 中,您不能像这样对它们调用 compose: addUmm(_).compose(addAhem(_)) , 接受的答案(以及其他一些答案似乎取决于 addUmmaddAhem 是方法,而不是函数,这在尝试调用 compose 时会产生问题。我满意地上床 sleep ,成功运行:
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)确实有点令人困惑。

最佳答案

a(_).compose(b(_))扩展到 x => { a(x).compose(y => b(y) } .因此错误。你要的是(x => a(x)).compose(y => b(y)) .添加一对括号可以解决此问题。

scala> (a(_)).compose(b(_: String))
res56: String => java.lang.String = <function1>

scala> res56("hello")
res57: java.lang.String = helloahemumm

但是自从 ab是函数,您可以避免所有这些麻烦,只需执行 a compose b .

关于scala - Scala 中方法、函数和部分应用函数的函数组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7683362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com