请注意以下奇怪行为(Scala 2.9.1.RC2):
scala> val spam = x => log(x)
spam: Double => Double = <function1>
scala> val spam = x => log(x)*log(x)
<console>:10: error: missing parameter type
val spam = x => log(x)*log(x)
^
scala> log(2)*log(2)
res30: Double = 0.4804530139182014
Scala如何推断出第一个的类型而不是第二个?
另一种陌生感:
scala> def eggs(foo:Int=-1) = foo
<console>:1: error: identifier expected but integer literal found.
def eggs(foo:Int=-1) = foo
^
scala> def eggs(foo:Int= -1) = foo
eggs: (foo: Int)Int
这里发生了什么?为什么在=和 - ?之间没有空格时会窒息?
答案 0 :(得分:11)
问题1 。令我惊讶的是,类型推断完全成功。另一个无法编译的情况是,
val spam = x => log(log(x))
通常,规则是必须明确参数类型(此处为x
)。但显然这条规则不适用于特殊情况x => f(x)
,它会被重写为f _
。在其他情况下,this rewriting leads to unspec'ed behavior。
注意:如果存在预期的函数类型,则参数类型不必是显式的,
val spam: Double => Double = x => log(log(x)) // OK
问题2 。如果没有空格,您就会遇到类型的“运算符”语法。这是一个 编译的例子,
trait =-[A, B]
trait One
def eggs(foo: Int=-One) = foo
这相当于,
def eggs(foo: =-[Int, One]) = foo
您收到的错误消息(标识符,但...... )表示整数文字1
不是有效类型。