斯卡拉.解释{a:Int => Int}

Tei*_*raz 2 scala anonymous-function

我是斯卡拉的初学者.

匿名函数语法对我来说很清楚:

(a: Int) => Int,

没有括号:a: Int => Int- 编译错误.

但有人能解释一下这种语法的目的吗?

{a: Int => Int}

只是另一种形式的匿名函数?

Łuk*_*asz 6

我不认为你很清楚.

(a: Int) => Int
Run Code Online (Sandbox Code Playgroud)

这条线不是某人实际打字的东西.它创建一个匿名函数,它在Int此处命名a并返回一个Int类型的对象,Int.type这是Int类的伴随对象.

scala> (a: Int) => Int
res0: Int => Int.type = <function1>
Run Code Online (Sandbox Code Playgroud)

这是完全相同的事情,只是包含在无用的块中,它将评估其中唯一的表达式.

{a: Int => Int}
Run Code Online (Sandbox Code Playgroud)

要正确地做事,要定义匿名函数说

val fun = (a: Int) => a + 5
Run Code Online (Sandbox Code Playgroud)

即放一些应该评估的表达式.

您还可以注释其类型 val

val fun: Int => Int = _ + 5
Run Code Online (Sandbox Code Playgroud)

例如,要定义函数的类型 Int => Int

def apply5(f: Int => Int) = f(5)
Run Code Online (Sandbox Code Playgroud)

看起来你混合了这两个概念(匿名函数的定义和函数的类型).

定义了两个你可以说

apply5(fun)
Run Code Online (Sandbox Code Playgroud)

哪个会有结果 10

我认为{a: Int => a + 5}和之间没有明显的区别(a: Int) => a + 5.实际上两者都很常见.例如,看看在Play中定义一个动作(请求的类型是注释只是为了应用到示例,它是不需要的)

Action { request: Request[AnyContent] =>
  // some more code
  Ok("")
}
Run Code Online (Sandbox Code Playgroud)