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

时间:2017-07-25 17:45:02

标签: 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

任何人都可以解释为什么method3不起作用?它有什么含糊之处吗?

2 个答案:

答案 0 :(得分:2)

确实有一种可能的解释是这种限制避免了歧义:x: A => B可以被理解为一个匿名函数,它接受x类型的参数A并返回对象{{1} }。或者可以理解为将变量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)

答案 1 :(得分:0)

Anonymous Functions section of the specification涵盖了所有这些变体。相关部分是

  

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

method3中,函数不是块的结果表达式;在method4它是。

编辑:哎呀,大概你的意思是为什么有限制。我现在暂时留下这个答案,说明确切的限制,如果有人给出更好的答案,请将其删除。