Различные взаимодействующие уровни состояния в haskell

Я эмулирую 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!

Вопросы:

  1. На правильном ли я пути?
  2. Сейчас, когда я вытаскиваю преобразователи монад, можно ли перестать рассматривать «текущий вывод» как состояние и просто передать его монаде ввода-вывода? Это было бы здорово, вместо того, чтобы держаться за это, я мог бы просто распечатать.
  3. На сколько слоев нужно разделить состояние? Я вижу два разных слоя, но они сильно зависят друг от друга (и память, и регистры зависят от состояния как памяти, так и регистров). Должен ли я хранить их вместе как одно состояние или разделить их и сложить? Какой подход даст наиболее читаемый код?
6
задан TheIronKnuckle 1 February 2012 в 09:19
поделиться