我是一个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*/
1条答案
按热度按时间vltsax251#
这两个值具有不同的类型:
换句话说,
literal1
是一个接受两个参数的函数-一个接受Int
并返回Int
,另一个接受Int
并返回Int
。另一方面,
literal2
是一个只带一个参数的函数--一个带Int
并返回Int
的函数,而 * return * 是一个带Int
并返回Int
的函数。除了调用约定不同之外,第二种形式允许您轻松地部分应用第一个参数,返回一个接受
Int
并返回Int
的函数:对第一个表单执行同样的操作需要稍微复杂一些的语法:
使用
curried
方法可以将第一种形式自动转换为第二种形式:请注意,在Scala中,对于只接受一个函数参数的函数和方法,通常会以curry格式将其指定为最终参数,因为这为多行lambda提供了方便的语法:
输出: