我正在从事一个涉及从Haskell中的数组读取和写入的项目。我想将数组存储为不可变数组类型(因为我想尽可能避免可变性),所以我正在为MArrayfreezethaw函数工作。我对应该如何使用这些功能感到困惑。这是我所拥有的(无法编译):

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


我不应该以这种方式使用数组,或者该如何解决?

最佳答案

它应该进行一些更改:

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

10-06 10:22