以下两个函数的类型有什么区别?
def add1: Int => Int => Int = a => b => a + b
def add2(a: Int)(b: Int) = a + b
根据他们的声明,他们似乎有相同的类型。两者都以相同的方式被调用:
scala> add1(1)(2)
res2: Int = 3
scala> add2(1)(2)
res3: Int = 3
但是,它们的类型存在明显差异:
scala> :t add1
Int => Int => Int
scala> :t add2
(a: Int)(b: Int)Int
此外,部分应用add1
比add2
更清晰。
scala> add1(1)
res4: Int => Int = <function1>
scala> add2(1)(_)
res5: Int => Int = <function1>
答案 0 :(得分:7)
add1
是一个没有参数返回Function1[Int, Function1[Int, Int]]
的方法。 add2
是一种方法,它接受两个参数列表并返回Int
。
进一步阅读:
答案 1 :(得分:1)
这两个定义之间肯定存在差异。考虑传递每个参数。
add1(1)
(Int) => Int = <function1>
add2(1)
<console>:9: error: missing arguments for method add2 in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
add2(1)
但是,如果您部分应用add2,则其类型与add1相同。
scala> :t add1
(Int) => (Int) => Int
scala> :t add2 _
(Int) => (Int) => Int
我非常了解add1。它是一个匿名函数,它接受一个Int并返回和Int =&gt; Int。这是一个curried函数的经典定义。
在完全理解add2之前,我需要做更多的阅读。据我所知,这是一种编写函数的方法,它们以不同的形式(即add2(1)(2)
)获取参数,并且可以很容易地转换为curried函数(add2 _
)。
希望这有帮助!我也期待更好地解释add2
。
编辑:这是一篇关于scala中curried方法的精彩文档:http://www.codecommit.com/blog/scala/function-currying-in-scala
答案 2 :(得分:1)
x.add1
是一个函数Int => Int => Int
。
x.add2
是一种方法,它不是值,与add1
的类型不同。要获得等同于x.add1
的对象,您必须使用x.add2 _
。