内部函数编译器似乎不允许自递归val。请在此处查看以下示例:
object Test {
val nats1 : Stream[Int] = 1 #:: (nats1 map (_ + 1)) // OK
def testfun() : Int = {
def nats2 : Stream[Int] = 1 #:: (nats2 map (_ + 1)) // OK
val nats3 : Stream[Int] = 1 #:: (nats3 map (_ + 1)) // Error!
nats2.head
}
def main(args : Array[String]) {
println(testfun)
}
}
第一个定义的工作并不令人惊讶,但第三个定义呢?为什么不允许在Scala中使用自我复兴的val内部函数?
这很遗憾,因为有时你想保持一个本地定义,但你希望它是一个值,而不是每次都完全评估的def。
一般来说,限制似乎没有必要。例如,以下Haskell-Code可以工作:
module Test where
nats1 :: [Int]
nats1 = 1 : (map (+1) nats1)
testfun :: Int
testfun = let nats2 = 1 : (map (+1) nats2)
in head nats2
main :: IO ()
main = putStrLn $ show testfun