Идиома, которую я использую для составления нескольких процедур (с памятью), выглядит следующим образом:
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), но я не уверен, что есть уже некоторые распространенные идиомы, которые использовали другие люди.