Scala 2.9中的错误或奇怪的行为

Urb*_*ond 4 parsing scala type-inference

请注意以下奇怪的行为(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
Run Code Online (Sandbox Code Playgroud)

为什么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
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?当=和 - 之间没有空格时,为什么会窒息?

Kip*_*ros 11

问题1.令我惊讶的是,类型推断完全成功.另一个无法编译的情况是,

val spam = x => log(log(x))
Run Code Online (Sandbox Code Playgroud)

通常,规则是x必须使参数类型(此处)显式化.但显然这条规则不适用于特殊情况x => f(x),后者会被重写f _.在其他情况下,这种重写导致了未指定的行为.

注意:如果存在预期的函数类型,则参数类型不必显式,

val spam: Double => Double = x => log(log(x)) // OK
Run Code Online (Sandbox Code Playgroud)

问题2.如果没有空格,您就会遇到类型的"运算符"语法.下面是一个例子编译,

trait =-[A, B]
trait One
def eggs(foo: Int=-One) = foo
Run Code Online (Sandbox Code Playgroud)

这相当于,

def eggs(foo: =-[Int, One]) = foo
Run Code Online (Sandbox Code Playgroud)

您收到的错误消息(标识符但是......)表示整数文字1不是有效类型.