0

我是 Scala 的新手,我在玩 Array.tabulate 方法。执行这段简化的代码片段(最初是 dp 问题)时,我得到了 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 方法来评估它——无限地一遍又一遍。

我究竟做错了什么?(我更新了代码片段,因为我是基于函数范式中动态编程中给出的解决方案,特别是 Antal SZ 的答案)

4

3 回答 3

0

您有效地导致了无限递归。您根本无法lazy val从其自己的初始化代码中引用 a 。您需要arr(0)(0)单独计算。

于 2013-09-26T19:58:37.490 回答
0

我能够通过在 Lazy 中包装 arr(0)(0) 来解决这个问题,因此它被评估为按名称调用的参数,因此不在制表方法中评估 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

我不确定您为什么要在构建 arr 之前尝试访问它, tabulate 似乎用于用函数填充数组 - 调用 arr 总是会导致无限递归。

在此处查看 Rex 的示例(并为他投票),也许这会有所帮助。

在用表格创建的多维序列中,最里面的序列是 1. 维吗?

于 2013-09-26T20:04:39.923 回答