提问人:vonBluten 提问时间:1/14/2023 最后编辑:Dmytro MitinvonBluten 更新时间:1/18/2023 访问量:87
Scala 文字函数(语法) - 两个版本,相同的结果 - 有什么区别?
Scala literal function (syntax) - two versions, same result - what is the difference?
问:
我是 Scala 初学者。有人可以解释一下这两行代码之间有什么区别(语法除外)(尽管它们返回相同的结果)?我给他们写了练习文字函数,并试图找出“幕后”是否有任何东西?
val literal1 = (fn: Int => Int, x: Int) => fn(x)
val literal2 = (fn: Int => Int) => (x: Int) => fn(x)
我看到有可能以不同的方式将参数传递到函数中。但是我选择哪种方式(咖喱盒除外)真的重要吗?
literal1(p => p + 1, 2) /*3*/
literal2(p => p + 1)(2) /*3*/
答:
0赞
Tim Moore
1/18/2023
#1
这两个值具有不同的类型:
val literal1: (Int => Int, Int) => Int = <function>
val literal2: (Int => Int) => (Int => Int) = <function>
换句话说,是一个接受两个参数的函数,一个函数接受一个并返回一个 ,一个 - 并返回一个 .literal1
Int
Int
Int
Int
另一方面,是一个接受一个参数的函数,一个接受一个并返回一个 的函数,并返回一个接受一个并返回一个 .literal2
Int
Int
Int
Int
除了不同的调用约定之外,第二种形式还允许您轻松地部分应用第一个参数,返回一个函数,该函数接受并返回:Int
Int
val doubler = literal2(_ * 2) // val doubler: Int => Int = <function>
doubler(2) // val res0: Int = 4
doubler(5) // val res1: Int = 10
对第一种形式执行相同的操作需要非常复杂的语法:
val doubler = literal1(_ * 2, _)
doubler(2)
doubler(5)
第一种形式可以使用其方法自动转换为第二种形式:curried
val literal3 = literal1.curried // val literal3: (Int => Int) => (Int => Int) = scala.Function2<function>
literal3(_ * 3)(6) // val res2: Int = 18
请注意,在 Scala 中,对于采用单个函数参数的函数和方法,以库里格式将其指定为最终参数是常规的,因为这允许为多行 lambda 提供方便的语法:
val literal4 = (x: Int) => (fn: Int => Int) => fn(x)
literal4(25) { x =>
val mod = x % 2
if (mod == 0) println("even")
else println("odd")
mod
}
输出:
val literal4: Int => ((Int => Int) => Int) = <function>
odd
val res3: Int = 1
评论