在Haskell

时间:2015-06-04 20:39:59

标签: arrays haskell

我正在开发一个涉及在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

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

2 个答案:

答案 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 = ...