声明参数类型时未解析Scala lambda函数?

声明参数类型时未解析Scala lambda函数?,scala,lambda,compiler-construction,Scala,Lambda,Compiler Construction,在Scala中定义方法时,我发现 def method1: Int => Int = (j: Int) => j // works def method2: Int => Int = j => j // works def method3: Int => Int = j: Int => j // error def method4: Int => Int = {j: Int => j} // works 有人能解释为什么方法3不起作用吗?

在Scala中定义方法时,我发现

def method1: Int => Int = (j: Int) => j  // works
def method2: Int => Int = j => j  // works
def method3: Int => Int = j: Int => j  // error
def method4: Int => Int = {j: Int => j}  // works

有人能解释为什么方法3不起作用吗?是否存在任何歧义?

所有这些变体都包含在本手册中。相关部分是

对于单个非类型化形式参数,
(x)=>e
可以缩写为
x=>e
。如果匿名函数
(x:T)=>e
如果单个类型参数显示为块的结果表达式,则可以将其缩写为
x:T=>e

方法3
中,函数不是块的结果表达式;在
method4
中,它是


编辑:哎呀,你大概是说为什么会有限制。我暂时不回答这个问题,只说限制是什么,如果有人给出更好的答案,请删除它。

一种可能的解释是,这种限制确实避免了歧义:
x:a=>B
可以理解为一个匿名函数,它接受
a
类型的参数
x
,并返回对象
B
。或者可以理解为将变量
x
强制转换为类型
a=>B
。这两个程序都是有效的程序是非常罕见的,但并非不可能。考虑:

class Foo(val n: Int)
val Foo = new Foo(0)
val j: Int => Foo = new Foo(_)

def method1: Int => Foo = (j: Int) => Foo
def method2: Int => Foo = j: Int => Foo

println(method1(1).n)
println(method2(1).n)
这实际上是编译和打印:

0
1

你介意解释一下“块的结果表达式”是什么意思吗?它是否表示“{}”@RossKeth是的。Scala中的一种表达式是块表达式:0、1或多个表达式被
{
}
包围。块的结果表达式是它的最后一个表达式。这看起来像是我正在寻找的正确答案。谢谢!