Я эмулирую 4-х битный микропроцессор. Мне нужно отслеживать регистры, память и текущий вывод (бонусные баллы за наличие счетчика циклов выборки-выполнения). Мне удалось сделать это без монад, но я чувствую беспорядок, передавая сразу столько всего в явном виде. Также определение функции запутанное, длинное и трудное для чтения.
Я пытался сделать это с помощью монад, но они просто не подходят друг другу. Я попытался рассматривать все отдельные компоненты состояния как один тип, но это оставило меня перед проблемой, что делать значение.
State Program () -- Represents the state of the processor after a single iteration of the fetch execute cycle
Был единственным типом, который имел хоть какое-то значение. Но зачем тогда вообще беспокоиться? Я попытался разбить его, вытащив строку из своего составного типа и обработав ее как значение
State Program' String
, что отлично сработало, за исключением того факта, что мне нужен был результат RUNNING. Что бы я ни делал, я не мог одновременно удерживать и струну, и состояние.
Теперь я пытаюсь разобраться с преобразователями монад. Похоже, я должен разделить все уровни состояния. Но моя голова быстро взрывается.
StateT Registers (StateT Memory (State Output)) a =
StateT (registers -> (StateT Memory (State Output)) (a,registers))
StateT Registers (StateT Memory (State Output)) a =
StateT (registers -> (Memory -> (Output -> (((a,Registers),Memory),Output))))
Я еще даже не поставил счетчик FEcycle!
Вопросы: