Piszę swój pierwszy prawdziwy projekt Haskell i mam problem z organizacją stanu w programie. Jest to emulator Gameboy Color, więc istnieje wiele małych flag, a cały stan wyglądaJak organizować duże ilości państw w projektach Haskell
data Memory s = Memory { memory :: STUArray s Word16 Word8
, registers :: STUArray s Word8 Word8
, sp :: STRef s Word16
, pc :: STRef s Word16
, cycles :: STRef s Word16
, ime :: STRef s Bool --Interrupt Master Enable Flag
, halt :: STRef s Bool --Are we halted or not
, mode :: STRef s GPUMode -- GPU mode
, line :: STRef s Word8 -- GPU line
, transferred :: STRef s Bool
, gpuCycles :: STRef s Word16
, window :: Window
, renderer :: Renderer
}
I robię wszystko odczytu/zapisu stanu jak:
data Address = OneRegister Register
| TwoRegister {registerA :: Register, registerB :: Register}
| MemAddr Word16
| SP
| PC
| CYCLES
| IME
| HALT_STATE
| GPU_MODE
| GPU_LINE
| GPU_TRANSFERRED_LINE
| GPU_CYCLES
data MemVal = MemVal8 Word8
| MemVal16 Word16
| Flag Bool
| Mode GPUMode
read :: Memory s -> Address -> ST s MemVal
write :: Memory s -> Address -> MemVal -> ST s()
widać : https://github.com/nikhilunni/HaskellBoy/blob/master/src/Memory.hs
Czy istnieje jakiś bardziej przejrzysty sposób na uporządkowanie wszystkiego? Chciałbym podzielić stan między różne komponenty (procesor, GPU, przełączanie banku kaset itp.), Jeśli to możliwe. Czy to jest idiomatyczne mieć duży monolityczny typ stanu w Haskell?
To bardzo duży problem z dodaniem nowego stanu do programu. Pakiet Control.Lens wydaje się być na dobrej drodze, ale nie jestem pewien, czy mogę go łatwo połączyć z ST.
Dzięki!
Początkowo myślałem "ha, jak duże byłoby to państwo?". Ale * "Piszę swój pierwszy prawdziwy projekt Haskell *, [...] *** emulator Gameboy Color" ***. Ambitne pierwsze kroki. – Zeta