Arrays 重新定义递归惰性数组的索引处的值

Arrays 重新定义递归惰性数组的索引处的值,arrays,haskell,Arrays,Haskell,我在尝试重新定义已定义索引上的值时出现了错误 简化示例: ghci > let axs = array (1,5) [(1,1),(2,2),(3,3),(4,4),(5,5),(1, 1 + axs!1)] ghci > axs array (1,5) [(1,^CInterrupted. 这将循环。我假设是Data.Array的惰性导致了这种行为 另一方面,这将不会循环,并将按预期工作(重新定义索引1) 有没有办法通过对self的递归来重新定义索引值? 我假设我需要强制对想要的

我在尝试重新定义已定义索引上的值时出现了
错误

简化示例:

ghci > let axs = array (1,5) [(1,1),(2,2),(3,3),(4,4),(5,5),(1, 1 + axs!1)]
ghci > axs
array (1,5) [(1,^CInterrupted.
这将循环。我假设是
Data.Array
的惰性导致了这种行为

另一方面,这将不会循环,并将按预期工作(重新定义索引1)

有没有办法通过对self的递归来重新定义索引值? 我假设我需要强制对想要的索引进行评估,以便能够使用前一个索引再次“更新”该值。
这是可能的还是我不应该/不能这样使用数组?

在递归定义中,右边定义的对象的含义是它的最终值。所以

x = x + 1
将是一个无限循环。在数组定义中(在GHC中),索引的值是它的最后一次出现,所以

axs = array (1,5) [(1,1),(2,2),(3,3),(4,4),(5,5),(1, 1 + axs!1)]

axs = array (1,5) [(2,2),(3,3),(4,4),(5,5),(1, 1 + axs!1)]
这其中的重要部分是

axs' = array (1,1) [(1, 1 + axs!1)]
这和

x = 1 + x
请注意,Haskell标准根本不允许在数组定义中进行“重新定义”,应该始终循环或抛出异常。GHC允许这样做,但这并不严格符合标准

即使在GHC中,“重新定义”也不是必须的。您不能逐个设置数组中的值。相反,数组定义是整个数组的声明性规范

如果您想要一种构造数组的命令式方法,请使用

这没有经过测试:

arr = runSTArray $ do
  retArr <- newArray (1,5) [(1,1),(2,2),(3,3),(4,4),(5,5)]
  curVal <- readArray retArr 1
  writeArray retArr 1 (curVal + 1)
  retArr
arr=runSTArray$do

retArr在递归定义中,右边定义的事物的含义是它的最终值。所以

x = x + 1
将是一个无限循环。在数组定义中(在GHC中),索引的值是它的最后一次出现,所以

axs = array (1,5) [(1,1),(2,2),(3,3),(4,4),(5,5),(1, 1 + axs!1)]

axs = array (1,5) [(2,2),(3,3),(4,4),(5,5),(1, 1 + axs!1)]
这其中的重要部分是

axs' = array (1,1) [(1, 1 + axs!1)]
这和

x = 1 + x
请注意,Haskell标准根本不允许在数组定义中进行“重新定义”,应该始终循环或抛出异常。GHC允许这样做,但这并不严格符合标准

即使在GHC中,“重新定义”也不是必须的。您不能逐个设置数组中的值。相反,数组定义是整个数组的声明性规范

如果您想要一种构造数组的命令式方法,请使用

这没有经过测试:

arr = runSTArray $ do
  retArr <- newArray (1,5) [(1,1),(2,2),(3,3),(4,4),(5,5)]
  curVal <- readArray retArr 1
  writeArray retArr 1 (curVal + 1)
  retArr
arr=runSTArray$do

retArr应该是
数组(1,6)…
,因为您有6个元素,而不是5个?声明说这确实是可能的,因为
数组
仅在索引中是严格的。它必须检查每个索引,以确保其在范围内且唯一。您还必须具有唯一的索引,因此如果您将其更改为
(6,1+axs!1)
,那么它将毫无问题地工作。是的,我知道它会工作。如果我将
(1,1+axs!1)
更改为
(1,1+axs!2)
,它将工作。但我正在寻找这种自我参照行为的解决方法(因此它不会循环)。从第二个示例中可以看出,列表中的索引不必是唯一的,但递归似乎只适用于不等于当前元素的索引(如果定义了递归)。例如,即使这样也可以:
让axs=array(1,5)[(1,1),(2,2),(3,3),(4,4+axs!5),(5,5),(1,1+axs!2)]
应该是
数组(1,6)…
因为您有6个元素,而不是5个?声明说这确实是可能的,因为
数组
仅在索引中是严格的。它必须检查每个索引,以确保其在范围内且唯一。您还必须具有唯一的索引,因此如果您将其更改为
(6,1+axs!1)
,那么它将毫无问题地工作。是的,我知道它会工作。如果我将
(1,1+axs!1)
更改为
(1,1+axs!2)
,它将工作。但我正在寻找这种自我参照行为的解决方法(因此它不会循环)。从第二个示例中可以看出,列表中的索引不必是唯一的,但递归似乎只适用于不等于当前元素的索引(如果定义了递归)。例如,即使这样也可以:
让axs=array(1,5)[(1,1)、(2,2)、(3,3)、(4,4+axs!5)、(5,5)、(1,1+axs!2)]