Sml 将数组传递到函数中,之后需要原始未修改的数组

Sml 将数组传递到函数中,之后需要原始未修改的数组,sml,Sml,我有一个函数,作为副作用,它会对传入的数组进行变异: fun do_something (n: int, v: bool array) = let val i = ref 0 val count = ref 0 in while !i < n do ( if Array.sub (v, !i) then Array.update (v, !i, false)

我有一个函数,作为副作用,它会对传入的数组进行变异:

fun do_something (n: int, v: bool array) =
       let 
          val i = ref 0
          val count = ref 0
       in while !i < n do
          ( if Array.sub (v, !i) then 
               Array.update (v, !i, false)
            else
               (count := !count + 1); 
            i := !i + 1
          );
          !count
       end
有趣的事情(n:int,v:bool数组)= 让 val i=参考0 val计数=参考值0 一会儿!我不知道 (如果Array.sub(v,!i)那么 Array.update(v,!i,false) 其他的 (计数:=!计数+1); i:=!i+1 ); !计数 结束
当函数结束时,我希望数组再次具有其原始内容。如何才能做到这一点?

我觉得您需要将数组作为某个点进行复制。如果您只修改数组的一小部分,则只存储增量并在最后恢复它们可能会更节省空间,但我想知道是否考虑到您的实际使用情况,除了数组之外的其他东西是正确的选择。做了一些编辑希望我更具体一些,所以我认为您的用例是您有一个不想更改的数组,但是您希望基于数组(可能是布尔值)计算一些东西,并且您计算返回值的算法涉及到对数组的变异。如果是这样的话,最好的解决方案就是得到一个更好的算法。也许是纯粹功能性的东西。如果不可能或效率太低,请制作本地副本。我不认为有第三种方法,在你的例子中,如果你不想改变数组,你的函数没有理由改变数组。它在修改元素后不会重新检查它。在我看来,您似乎必须将数组作为某个点进行复制。如果您只修改数组的一小部分,则只存储增量并在最后恢复它们可能会更节省空间,但我想知道,如果给您实际的使用案例,除了数组之外的其他东西是正确的选择。做了一些编辑希望我更具体一些,所以我认为您的用例是您有一个不想更改的数组,但是您希望基于数组(可能是布尔值)计算一些东西,并且您计算返回值的算法涉及到对数组的变异。如果是这样的话,最好的解决方案就是得到一个更好的算法。也许是纯粹功能性的东西。如果不可能或效率太低,请制作本地副本。我不认为有第三种方法,在你的例子中,如果你不想改变数组,你的函数没有理由改变数组。它从不在修改元素后重新检查它。