gpt4 book ai didi

scala - 在 Scala 中调用柯里化(Currying)函数?

转载 作者:行者123 更新时间:2023-12-01 10:34:38 24 4
gpt4 key购买 nike

所以我对 Scala 中柯里化(Currying)函数的工作原理有点困惑。我有以下编译代码,但我不确定如何编译!

def fixedPoint(f: Double => Double, initialGuess: Double) = {
//dummy impl, does nothing.
}

def averageDamp(f: Double => Double)(x: Double) = (x + f(x))/2

def sqrt(x: Int) = {
fixedPoint(averageDamp(y => x/y))(1)
}

这段代码编译得很好,但我认为 averageDamp 还需要接受另一个参数?所以应该是:

fixedPoint(averageDamp(y=> x/y)(1))(1)

但这不能编译,我收到一条消息说类型不匹配;发现:双倍要求:双倍⇒双倍

以下不编译,这是有道理的:

val num = averageDamp(y => x/y)

这会给出编译错误消息:“对象 Foo 中的方法 averageDamp 缺少参数列表未应用的方法仅转换为 当需要函数类型时起作用。”

所以我不确定为什么在对 fixedPoint 的调用中使用一个参数调用 averageDamp 时它会编译,但当我单独调用它时却无法编译。

任何帮助都会很棒。

最佳答案

这是编译的代码

def fixedPoint(f: Double => Double, initialGuess: Double) = {
//dummy impl, does nothing.
}

def averageDamp(f: Double => Double)(x: Double) = (x + f(x))/2

def sqrt(x: Int) = {
fixedPoint(averageDamp(y => x/y), 1)
}

在这一行

fixedPoint(averageDamp(y => x/y), 1)

即使 averageDamp 需要多一个参数列表(它有一个多参数),但不放置它也是有效的。实际上,这就是为什么它首先被定义为 curried 的原因 - 这样您就可以将它用作函数。

scala>     val num = averageDamp(y => 5/y)(1)
num: Double = 3.0

会像您期望的那样为您提供 Double 类型的结果。

如果你不传递第二个参数列表你可以接收一个函数

val fun = averageDamp(y => 5/y)

给你一个错误试图告诉你你需要通知编译器你想让 fun 成为一个函数。您可以通过以下方式执行此操作:

scala>     val fun: Double => Double = averageDamp(y => 5/y)
fun: Double => Double = <function1>
scala> val fun = averageDamp(y => 5/y) _
fun: Double => Double = <function1>

现在看fixedPoint

def fixedPoint(f: Double => Double, initialGuess: Double)

它需要一个函数 Double => Double 所以我们可以传递它

fixedPoint(averageDamp(y => 5/y), 1)

编译器知道第一个参数应该是一个函数,并根据这一知识将此方法转换为一个函数,该函数尚未采用 x: Double 参数并将返回 (x + f (x))/2

关于scala - 在 Scala 中调用柯里化(Currying)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37902008/

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