我正在模拟一个4位微处理器。我需要跟踪寄存器,内存和运行输出(还有一个获取执行周期计数器的奖励点)。我已经设法做到了这一点,但没有monad,但是感觉很混乱,一次性传递了很多东西。此外,功能定义很混乱,很长,很难阅读。haskell中不同的交互级别状态
我试图用monads做到这一点,它只是不适合在一起。我尝试将所有单独的状态组件作为单一类型处理,但这给我留下了什么使价值的问题。
State Program() -- Represents the state of the processor after a single iteration of the fetch execute cycle
是唯一有意义的类型。但是那个时候为什么还要打扰呢?我试图通过拉动串出我的复合型的,并把它当作值
State Program' String
这除了事实上,我需要运行输出伟大的工作,打破它。无论我做了什么,我都无法同时坚持弦乐和状态。
现在我试图解决monad变压器问题。看起来我必须把所有不同层次的国家分开。但我的头快速爆发。
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计数器呢!
问题:
- 我在正确的轨道上?
- 看到我现在正在拔出monad变压器,是否有可能停止将“运行输出”视为状态并将其关闭到IO monad?这将是很棒的,而不是坚持下去,我可以打印它。
- 我应该将状态分成多少层?我可以看到两个不同的层,但它们彼此紧密依赖(内存和寄存器都取决于内存和寄存器的状态)。我应该将它们作为一个单独的状态保存在一起,还是将它们分开并叠加起来?哪种方法会产生最易读的代码?
也许“运行输出”可能最好使用Writer monad表示(请参阅http://monads.haskell.cz/html/writermonad.html)? – 2012-02-01 09:22:58