gpt4 book ai didi

scala - 这两个 Scala 定义有什么区别

转载 作者:行者123 更新时间:2023-12-04 20:15:02 25 4
gpt4 key购买 nike

我在 Scala 中有以下 2 个定义,它们给出了相同的结果。但是它们之间有点不同。

def sum(f: Int => Int)(a: Int, b: Int): Int =
if (a > b) 0 else f(a) + sum(f)(a + 1, b) //> sum: (f: Int => Int)(a: Int, b: Int)Int

sum(x => x*x)(1,2) //> res3: Int = 5

第二个是

def sum(f: Int => Int,a: Int, b: Int): Int =
if (a > b) 0 else f(a) + sum(f,a + 1, b) //> sum2: (f: Int => Int, a: Int, b: Int)Int

sum(x => x*x,1,2) //> res4: Int = 5

我看到的唯一不同是 sum(f: Int => Int,a: Int, b: Int)sum(f: Int => Int)(a: Int , b: Int) .在后一种情况下,函数参数和值参数是分开的。

这是什么行为。这真的是一样的还是它们之间有什么不同?

最佳答案

就您使用它们的方式而言,它们几乎完全相同。但总的来说,第一个版本具有一些额外的灵 active (和实用性)。

例如

val g = sum(x => x*x) _  //g has type (Int, Int) => Int
println(g(2, 3)) //prints 13

这称为柯里化(Currying)。您可以使用两个以上的参数列表来执行此操作,例如

def foo(b: Boolean)(i: Int)(s: String)(d: Double): Int = ...
val g = foo(true) _ //g has type Int => (String => (Double => Int))
val h = g(3) _ //h has type String => (Double => Int)
val r = h("asdf") _ //r has type Double => Int

下划线有时可以根据上下文省略,例如

val r: Int => Double = foo(true)(3)("asdf")

多参数列表也用于隐式参数,有时 Scala 编译器需要类型推断方面的帮助。当与按名称调用参数一起使用时,它们还可以方便地通过库创建假语法或控制结构,例如

def repeat(n: Int)(body: => Unit) { 
var i = n
while (i > 0) { i -= 1; body }
}

var counter = 0
repeat(10) { //This method call (repeat) looks a bit like a part
println(s"Hello: $counter") //of the language due to call-by-name argument,
counter += 1 //multiple parameter lists, use of curly braces, etc.
}

结果

你好:1你好:2...你好 9

关于scala - 这两个 Scala 定义有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33073827/

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