J'apprends Haskell à partir de "LYAH" et je suis arrivé à la monade State. Comme exercice, je travaille sur l'implémentation d'un simple "virtual cpu". La monade d'état semble être une bonne solution pour cela mais je n'arrive pas à comprendre comment l'utiliser. Voici un exemple très dépouillé de ce que j'ai pour l'instant (sans la monade d'état) :
data Instruction = Incr | Decr | Halt
data Computer = Computer { program :: [Instruction],
acc :: Int,
pc :: Int,
halted :: Bool
}
main = do
let comp = Computer { program = [Incr, Decr, Incr, Incr, Halt]
, acc = 0
, pc = 0
, halted = False
}
execute comp
execute :: Computer -> IO ()
execute comp = do
let (output, comp') = step comp
putStrLn output
case halted comp' of
False -> execute comp'
True -> return ()
step :: Computer -> (String, Computer)
step comp = let inst = program comp !! pc comp
in case inst of
Decr -> let comp' = comp{ acc = acc comp - 1,
pc = pc comp + 1 }
output = "Increment:" ++
" A = " ++ (show $ acc comp') ++
" PC = " ++ (show $ pc comp')
in (output, comp')
Incr -> let comp' = comp{ acc = acc comp + 1,
pc = pc comp + 1 }
output = "Decrement:" ++
" A = " ++ (show $ acc comp') ++
" PC = " ++ (show $ pc comp')
in (output, comp')
Halt -> let comp' = comp{halted = True}
output = "HALT"
in (output, comp')
Mon step
ressemble à la monade d'état mais je ne vois pas comment l'utiliser ici. Serait-elle applicable ? Est-ce que cela simplifierait ce code, ou est-ce que cet exemple est meilleur tel qu'il est ?