Como posso escrever esse código simples usando a mônada do estado?

Sou iniciante em Haskell e me deparei com uma situação em que gostaria de usar a mônada estadual. (Ou, pelo menos, acho que é isso que eu gostaria de usar.) Há um milhão de tutoriais para a mônada estadual, mas todos parecem assumir que meu principal objetivo é compreendê-lo em um nível conceitual profundo e consequentemente, eles param imediatamente antes da parte em que dizem como realmente desenvolver software com ele. Então, estou procurando ajuda com um exemplo prático simplificado.

Abaixo está uma versão muito simples da aparência do meu código atual. Como você pode ver, estou analisando o estado através de minhas funções, e minha pergunta é simplesmente como reescrever o código usando o comandodo notação para que eu não tenha que fazer isso.

data Machine = Register Int

addToState :: Machine -> Int -> Machine
addToState (Register s) a = Register $ s+a

subtractFromState :: Machine -> Int -> Machine
subtractFromState (Register s) a = Register (s-a)

getValue :: Machine -> Int
getValue (Register s) = s

initialState = Register 0

runProgram = getValue (subtractFromState (addToState initialState 6) 4)

O código simula uma máquina abstrata simples que possui um único registro e instruções para adicionar ao registro, subtraí-lo e obter seu valor. O "programa" no final inicializa o registro para 0, adiciona 6 a ele, subtrai 4 e retorna o resultado, que obviamente é 2.

Entendo o propósito da mônada estadual (ou pelo menos acho que sim), e espero que me permita reescrever isso para que eu acabe com algo como

runProgram :: ???????
runProgram = do
    put 0
    addToState 6
    subtractFromState 4
    value <- getValue
    return value

No entanto, apesar de todos os tutoriais que li, ainda não sei como transformar meu código neste formulário.

É claro que o estado real da minha máquina é muito mais complicado, e também estou passando a saída (que será passada para outra máquina) e várias outras coisas, por isso estou bastante disposto a simplificá-la. Saber fazer isso para este exemplo simplificado seria uma grande ajuda.

Atualizar: Após a excelente resposta de Lee, agora eu sei como fazer isso, mas estou empolgado em escrever código da mesma forma elegante quando tenho várias máquinas interagindo. Eu perguntei sobre isso emuma nova pergunta.

questionAnswers(1)

yourAnswerToTheQuestion