2014-04-15 49 views
0

为什么我要声明的返回类型是这样的:斯卡拉:匿名函数的返回类型

def main(args: Array[String]): Unit = { 
    val n = (x: Int) => (1 to x) product: Int 
    println(n(5)) 
} 

如果我删除的类型,我会打印前必须给它分配:

def main(args: Array[String]): Unit = { 
    val n = (x: Int) => (1 to x) product 
    val a = n(5) 
    println(n(5)) 
} 

这个变体给出了一个错误 - 为什么?

val n = (x: Int) => (1 to x) product 
println(n(5)) 

我得到以下错误(使用Scala的-IDE):

递归值n型需求Test.scala/src目录线5斯卡拉问题

+2

运行你张贴在REPL的代码时,我没有得到任何错误。你能否详细说明你有什么错误? –

+0

我把它添加到我的问题:) – Megamind

+0

与Scala 2.10.2很好地工作。你使用什么版本? – Christian

回答

3

你看到一个问题由于使用了后缀运算符(product):

// Error 
val n = (x: Int) => (1 to x) product 
println(n(5)) 

// OK - explicit semicolon 
val n = (x: Int) => (1 to x) product; 
println(n(5)) 

// OK - explicit method call instead of postfix - I prefer this one 
val n = (x: Int) => (1 to x).product 
println(n(5)) 

// OK - note the newline, but I wouldn't recommend this solution! 
val n = (x: Int) => (1 to x) product 

println(n(5)) 

从本质上讲,Scala会对表达式结束的地方感到困惑,所以您需要以某种方式更明确一些。

根据编译器的设置,这个功能可以由默认情况下禁用 - 见Scala's "postfix ops"SIP-18: Modularizing Language Features

+0

谢谢@DNA! – Megamind