Como evito me referir a todas as variáveis de estado ao atualizar apenas algumas?

Um idioma usado para compor alguns procedimentos (com memória) é o seguinte:

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

No entanto, à medida que o número de variáveis de estado aumenta, isso rapidamente fica muito mais detalhado do que o necessário:

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

Como eu estava pensando, existe uma maneira de atualizar apenas algumas variáveis de estado sem precisar se referir a todas as não utilizadas? Eu estava pensando em algo comoIORef mas peloState (de fato, há um pacotestateref), mas não tenho certeza se já existem alguns idiomas comuns que outras pessoas estão usando.

questionAnswers(3)

yourAnswerToTheQuestion