Scala中类似的curried类型之间的区别

ear*_*las 9 scala

以下两个函数的类型有什么区别?

def add1: Int => Int => Int = a => b => a + b
def add2(a: Int)(b: Int) = a + b
Run Code Online (Sandbox Code Playgroud)

根据他们的声明,他们似乎有相同的类型.两者都以相同的方式调用:

scala> add1(1)(2)
res2: Int = 3

scala> add2(1)(2)
res3: Int = 3
Run Code Online (Sandbox Code Playgroud)

但是,它们的类型存在明显差异:

scala> :t add1
Int => Int => Int

scala> :t add2
(a: Int)(b: Int)Int
Run Code Online (Sandbox Code Playgroud)

另外,部分应用add1比有点清洁add2.

scala> add1(1)
res4: Int => Int = <function1>

scala> add2(1)(_)
res5: Int => Int = <function1>
Run Code Online (Sandbox Code Playgroud)

ret*_*nym 7

add1是一个没有参数返回a的方法Function1[Int, Function1[Int, Int]].add2是一个采用两个参数列表并返回一个的方法Int.

进一步阅读:

Scala中方法和函数之间的区别