我用合成一對夫婦的程序(內存)一個成語如下:如何在更新少數時避免引用所有狀態變量?
p1 :: State (Int, String)()
p1 = do
(a, b) <- get
... do something ...
put (a', b)
p2 :: State (Int, String)()
p2 = do
(a, b) <- get
... do something else ...
put (a, b')
main = do
... initializing a0 b0 ...
print . flip evalState (a0, b0)
. sequence $ replicate 10 p1 ++ repeat p2
然而,隨着狀態變量的數量的增加,這種快速獲取方式比必要的更詳細:
p1 :: State (Int, String, Bool, Int, String, Bool)()
p1 = do
(a, b, c, d, e, f) <- get
... do something ...
put (a, b, c', d, e, f')
p2 :: State (Int, String, Bool, Int, String, Bool)()
p2 = do
(a, b, c, d, e, f) <- get
... do something ...
put (a', b', c, d, e, f)
main = do
print . flip evalState (a0, b0, c0, d0, e0, f0)
. sequence $ replicate 10 p1 ++ repeat p2
正如我想知道的,有沒有辦法只更新幾個狀態變量而不必引用所有未使用的變量呢?我在想像IORef
,但State
(事實上有一個包stateref),但我不確定是否已經有一些其他人一直使用的常見成語。
我有種感覺,在這種情況下,記錄語法可能更適合。所以像'State MyState()'這裏的'MyState = MyState {a :: Int,b :: String,c :: Bool,...}'。 – trVoldemort
所以如果只更新'a',我可以寫'put $ myState {a = a'}'。 – trVoldemort
您可能也喜歡在新的MyState類型中使用RecordWildCards擴展名 – jberryman