Scala 以两种方式声明函数。区别是什么?

Scala 以两种方式声明函数。区别是什么?,scala,Scala,这两个函数声明实际上是不同的吗 如果没有,为什么它们有不同的toString值 scala> def f: (Int) => Int = x=> x*x f: (Int) => Int scala> def f(x: Int) = x*x f: (Int)Int 第一个是无参数方法f1,它返回函数1[Int,Int] scala> def f1: (Int => Int) = (x: Int) => x * x f1: (Int) =>

这两个函数声明实际上是不同的吗

如果没有,为什么它们有不同的toString值

scala> def f: (Int) => Int = x=> x*x
f: (Int) => Int

scala> def f(x: Int) = x*x
f: (Int)Int

第一个是无参数方法
f1
,它返回
函数1[Int,Int]

scala> def f1: (Int => Int) = (x: Int) => x * x
f1: (Int) => Int
第二个是一个单参数方法
f2
,它接受一个
Int
并返回一个
Int

scala> def f2(x: Int): Int = x * x
f2: (x: Int)Int
您可以使用相同的语法调用f1和f2,但在调用
f1(2)
时,它会扩展为
f1。应用(2)


练习:f1的类型是什么?

这些是方法声明,而不是函数声明。第一个方法返回一个函数,第二个方法返回一个
Int
,与函数无关


请看。

这不是答案,但我猜第二个函数的返回类型是推断出来的,这就是区别,因为afaik Scala有运算符重载,这意味着x*x不必是Int。@Gabriel:不,这是不正确的。一个无参数函数,返回一个将Int映射到Int的函数。Scala>f1 res6:()=>(Int)=>Int=有趣的是,我们可以继续“提升”。。。scala>res6 ures7:()=>()=>(Int)=>Int=scala>res7 res8:()=>()=>(Int)=>Int=scala>res8()()()(9)res9:Int=81感谢@retronym提供的信息。这个练习很好!顺便说一句,Scala中这种转换的精确术语是Eta扩展。参见中的“6.7方法值”和“6.25.5 Eta扩展”
scala> f1
res0: (Int) => Int = <function1>

scala> f1(2)
res1: Int = 4

scala> f1.apply(2)
res2: Int = 2

scala> f2(2)
res3: Int = 4
scala> f2
<console>:6: error: missing arguments for method f2 in object $iw;
follow this method with `_' if you want to treat it as a partially applied funct
ion
       f2
       ^

scala> f2 _
res7: (Int) => Int = <function1>

scala> (f2 _).apply(2)
res8: Int = 4