Scala:函数中的自递归val

时间:2013-12-30 16:45:04

标签: function scala recursion

内部函数编译器似乎不允许自递归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

0 个答案:

没有答案