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

时间:2011-10-09 17:22:04

标签: scala

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

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

此外,部分应用add1add2更清晰。

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

scala> add2(1)(_)
res5: Int => Int = <function1>

3 个答案:

答案 0 :(得分:7)

add1是一个没有参数返回Function1[Int, Function1[Int, Int]]的方法。 add2是一种方法,它接受两个参数列表并返回Int

进一步阅读:

Difference between method and function in Scala

答案 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。它是一个匿名函数,它接受一个I​​nt并返回和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 _