Scala匿名函数语法和返回类型

4
我发现 Scala 有几种匿名函数语法:
val m5_1 = { (n: Int) => n * 5 }

val m5_2 = (n: Int) => { n * 5 } : Int

val m5_3: Int => Int = n => { n * 5 }

这是所有类型还是还有其他语法种类存在?

它们都等价吗?

哪个更/不太受欢迎?

我如何在m5_1中指定返回类型?


返回类型:val m5_1: (Int) => Int = { (n: Int) => n * 5 }。如果您使用Intellij,它可以自动为您添加返回类型。 - nmat
3个回答

6
我会尝试补充@ pamu的答案:
哪个更/不太受欢迎? 我认为第二种变体有点不常见。当类型推断很容易看出时,您可以选择第一种方式;否则,像第三种情况中那样明确地表达很好。您不需要大括号,因此更简单的选择是:
val m5_3: Int => Int = n => n * 5

甚至可以这样做
val m5_3: Int => Int = _ * 5

我该如何在m5_1中指定返回类型?
返回类型为`Int => Int`,这与第三种情况使用的类型注释相同。
val m5_1: Int => Int = { (n: Int) => n * 5 }

当然,您也可以在右侧使用Scala的类型推断:

val m5_1: Int => Int = n => n * 5

因此,这与您的第三种形式是相同的。
请注意,在第二种形式中,:Int 并不是定义 m5_2 的类型,它的类型是 Int => Int 而不是 Int。它只是告诉 Scala n * 5 的类型应该是 Int。这可以帮助您阅读代码,但实际上并不改变在这种情况下类型推断的方式。您可以认为您的第二种形式实际上是:
val m5_2 = (n: Int) => { 
  val res = n * 5: Int  // : Int redundant here because it is already inferred
  res
}

val res = n * 5: Int 的效果与 val res: Int = n * 5 相同。


3

是所有类型还是还有其他语法种类?

λ(Lambda)语法要求已知输入参数类型。如果未知,则编译器会抛出错误。在你试图使用的所有语法中,你都需要提供此信息。但返回类型可以由编译器推断。

它们都等价吗?

它们都是等价的。

哪一个更受偏爱?

如果您不想看到显式类型注释,建议使用以下语法。

val m5_1 = { (n: Int) => n * 5 }

我该如何在m5_1中指定返回类型?
返回类型将从 lambda 的最后一行推断出来。最后一行是“n * 5”,它的类型为Int。因此,编译器已经为您推断了类型。您可以跳过显式地提供类型信息。

0

好的,以上答案已经解释得差不多了。我只想再补充一种我们可以在这里做的变体:

val m5_4 = {n=> n*5}:Int=>Int

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接