我正在开发一个涉及在Haskell中从数组中读取和写入的项目。我想将数组存储在一个不可变的数组类型中(因为我希望尽可能避免可变性),所以我正在使用MArray的freeze
和thaw
函数。我很困惑我应该如何使用这些功能。这就是我所拥有的(不编译):
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
我不应该以这种方式使用数组,或者我该如何解决这个问题呢?
答案 0 :(得分:4)
它应该有一些改变:
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
答案 1 :(得分:2)
jhickner的回答是正确的,但似乎你只是彻底改造了(//)
(它的实施方式非常类似于你的编写方式):
modifyBoard bd = bd // map (\xy -> (xy, Filled t)) ps
where t = ...
ps = ...