Elm生命游戏程序变得毫无反应-有没有办法优雅地失败?

Elm生命游戏程序变得毫无反应-有没有办法优雅地失败?,elm,conways-game-of-life,Elm,Conways Game Of Life,我有一个基本的实现康威的游戏的生活写在榆树运行 源是可见的 该程序允许用户调整toroïdal网格的大小,点击单元格改变其状态,并随机化世界。它适用于我的计算机上的小值(小于50) 但是,当尝试在较大的网格上使用“随机化网格”功能时(阈值似乎并不总是相同),程序会在没有任何警告的情况下失去响应,恢复的唯一方法是重新加载应用程序 GOL算法中没有优化,对每个单元格使用一个svg矩形可能效率极低,但它没有解释为什么程序会以这种方式运行,而不是说速度变慢 这是elm运行时放弃的吗?还是某种浏览器保护

我有一个基本的实现康威的游戏的生活写在榆树运行

源是可见的

该程序允许用户调整toroïdal网格的大小,点击单元格改变其状态,并随机化世界。它适用于我的计算机上的小值(小于50)

但是,当尝试在较大的网格上使用“随机化网格”功能时(阈值似乎并不总是相同),程序会在没有任何警告的情况下失去响应,恢复的唯一方法是重新加载应用程序

GOL算法中没有优化,对每个单元格使用一个
svg
矩形可能效率极低,但它没有解释为什么程序会以这种方式运行,而不是说速度变慢

这是elm运行时放弃的吗?还是某种浏览器保护


更重要的是,除了任意限制网格的最大大小之外,还有其他方法可以防止这种行为吗

您观察到的行为是由于Javascript堆栈溢出造成的。按下“随机化”按钮后,在浏览器控制台中,您可以看到消息“Uncaught RangeError:超出最大调用堆栈大小”

这是因为randomize函数分配了几个大的临时变量。特别是,shuffle函数(从randomize函数调用)似乎分配了两个临时列表,每个临时列表对生命网格中的每个单元格都有一个元素。Elm可能会明智地及时发布这些信息,但这似乎太过分了

要解决此问题,可以使用更简单的随机化函数。下面显示的版本使用Elm生成器生成一个死/活值列表,然后从该列表初始化随机化数组

randomize2 : Array Cell -> Int -> Int -> Int -> Array Cell
randomize2 grid gs sd n = 
  let floatGen = Random.float 0.0 1.0
      lifeGen = Random.map (\b -> if (b < toFloat n/100) then Alive else Dead) floatGen
      listGen = Random.list (gs*gs) lifeGen
  in fst (Random.step listGen (initialSeed sd)) |> fromList
randomize2:Array Cell->Int->Int->Int->Int->Array Cell
随机化2网格gs sd n=
设floatGen=Random.float 0.0 1.0
lifeGen=Random.map(\b->if(bfromList中
使用这个随机化功能,我能够将网格大小调整到600x600,并成功地随机化。在这一点上,我停止了测试