Я эмулирую 4-битный микропроцессор. Мне нужно следить за регистрами, памятью и текущим выходом (бонусные баллы за счет счетчика цикла выборки). Мне удалось сделать это без монадов, но он чувствует себя грязным, проходя мимо этого многого материала сразу же. Также определение функции грязно, долго и трудно читать.Различные, взаимодействующие уровни состояния в haskell
Я пытался сделать это с монадами, и он просто не подходит друг другу. Я пробовал обрабатывать все отдельные компоненты состояния как один тип, но это оставило мне проблему того, что делать.
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!
Вопросы:
- Am Я на правильном пути?
- Видя, как я вытаскиваю трансформаторы монады сейчас, можно ли прекратить обрабатывать «бегущий выход» как состояние и просто поднести его к монаде IO? Это было бы потрясающе, вместо того, чтобы держаться за него, я мог просто распечатать его.
- Сколько слоев следует отделить в? Я вижу два разных слоя, но они зависят друг от друга близко (как память, так и регистры зависят от состояния как памяти, так и регистров). Должен ли я держать их вместе как единое государство или разделять их и складывать? Какой подход даст самый читаемый код?
Возможно, «работающий выход» может быть лучше всего представлен с использованием монады Writer (см. Http://monads.haskell.cz/html/writermonad.html)? –