我在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
?
答案 0 :(得分:5)
我会尝试添加@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
与[{1}}
答案 1 :(得分:3)
是否存在所有类型或更多语法类型?
Lambda语法要求输入参数类型是已知的。如果不是编译器抛出错误。在您尝试提供此信息的所有语法中。但是返回类型可以由编译器推断。
它们都相同吗?
一切都是等价的
哪一个更受/更不受欢迎?
如果您不想查看显式类型注释,建议使用以下注释
val m5_1 = { (n: Int) => n * 5 }
如何在m5_1中指定返回类型?
返回类型是从lambda的最后一行推断出来的。最后一行是n * 5
,类型为Int。因此,编译器会为您推断出类型。您可以跳过明确提供类型信息
答案 2 :(得分:0)
嗯,上面的答案已经恰当地解释了我猜的几乎所有内容。我只想添加一个我们可以在这里做的变体:
val m5_4 = {n=> n*5}:Int=>Int