2013-09-26 65 views
0

我是新來的斯卡拉,我正在玩Array.tabulate方法。執行這段簡單的代碼段時(原本是一個dp問題),我得到一個StackOverFlowError。Array.tabulate StackOverFlowError

import Lazy._ 

    class Lazy[A](x: => A) { 
    lazy val value = x 
    } 

    object Lazy { 
    def apply[A](x: => A) = new Lazy(x) 
    implicit def fromLazy[A](z: Lazy[A]): A = z.value 
    implicit def toLazy[A](x: => A): Lazy[A] = Lazy(x) 
    } 

    def tabulatePlay(): Int = { 
    lazy val arr: Array[Array[Lazy[Int]]] = Array.tabulate(10, 10) { (i, j) => 
     if (i == 0 && j == 0) 
     0 // some number 
     else 
     arr(0)(0) 
    } 
    arr(0)(0) 
    } 

調試,我注意到,因爲ARR是懶和當它達到ARR(0)(0)表達它試圖通過再次調用Array.tabulate方法對其進行評估 - 無限反覆。

我在做什麼錯了? (我更新了代碼片斷,因爲我將它從Dynamic programming in the functional paradigm中給出的解決方案中刪除,特別是Anntal S-Z的答案)

回答

0

我能夠通過包裝ARR(0)(0)在懶惰因此它被評價爲呼叫按姓名參數,從而不評估所述平板狀方法ARR來解決這個問題。我引用的代碼是使用implicits(二進制+運算符)自動轉換它,所以它不是很清楚。

def tabulatePlay(): Int = { 
    lazy val arr: Array[Array[Lazy[Int]]] = Array.tabulate(10, 10) { (i, j) => 
     if (i == 0 && j == 0) 
     1 // some number 
     else 
     new Lazy(arr(0)(0)) 
    } 
    arr(0)(0) 
    } 

謝謝大家。

0

您已經有效地導致了無限遞歸。您無法在其自己的初始化代碼中引用lazy val。您需要分別計算arr(0)(0)

+0

查看我更新的帖子。任何理由,爲什麼它在我引用的職位,但不是我的職位?謝謝。 – xxtommoxx

+0

@xxtommoxx你指的是哪個特定答案? – ghik

+0

對不起忘了提及Antal S-Z的回答 – xxtommoxx