0

私は Scala が初めてで、Array.tabulate メソッドをいじっていました。この簡略化されたコード スニペットを実行すると、StackOverFlowError が発生します (元は dp の問題)。

  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 メソッドを再度呼び出して評価しようとすることに気付きました。

私は何を間違っていますか?(コードスニペットを更新しました。これは、関数型パラダイムでの動的プログラミング、特にAntal SZの回答で与えられたソリューションに基づいていたためです)

4

3 に答える 3

0

arr(0)(0) を Lazy でラップすることでこれを解決できたので、名前による呼び出しパラメーターとして評価されるため、tabulate メソッドで arr を評価しません。私が参照したコードは、暗黙的 (バイナリ + 演算子) を使用して自動的に変換していたため、明確ではありませんでした。

 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)
  }

皆さんありがとう。

于 2013-09-27T03:29:16.077 に答える
0

効果的に無限再帰を引き起こしました。lazy val独自の初期化コード内からa を参照することはできません。arr(0)(0)別途計算する必要があります。

于 2013-09-26T19:58:37.490 に答える