我正在进行一个项目,其中包括从Haskell的数组中进行读写。我希望将数组存储在不可变的数组类型中(因为我希望尽可能避免易变性),所以我正在使用freeze和thaw函数作为MArray的函数。不过,我对如何使用这些函数感到困惑。这就是我所拥有的(不是编译的):
modifyBoard bd = freeze mbd
where
t = view falling st
ps = extractLocs t
mbd = runSTArray $ do
a <- thaw bd
mapM_ (\xy -> writeArray mbd xy (Filled t)) ps
return a我不应该以这种方式使用数组,或者如何解决这个问题?
发布于 2015-06-04 23:30:10
它应该与几个更改一起工作:
1.)修改解冻后的a,而不是未解冻的bd。
2.)没有必要在runSTArray后再冻.您返回的结果已经冻结。
modifyBoard bd = mbd
where
t = view falling st
ps = extractLocs t
mbd = runSTArray $ do
a <- thaw bd
mapM_ (\xy -> writeArray a xy (Filled t)) ps
return a发布于 2015-06-05 01:52:15
jhickner的回答是正确的,但似乎您只是简单地重新发明了(//) (它的实现非常类似于您编写它的方式):
modifyBoard bd = bd // map (\xy -> (xy, Filled t)) ps
where t = ...
ps = ...https://stackoverflow.com/questions/30653727
复制相似问题