4 비트 마이크로 프로세서를 에뮬레이트하고 있습니다. 레지스터, 메모리 및 실행중인 출력 (페치 실행 사이클 카운터가있는 경우 보너스 포인트)을 추적해야합니다. 나는 모나드가 없어도 이것을 할 수 있었지만, 많은 것을 한 번에 지나치게 지나치게 지저분하게 느꼈다. 또한 함수 정의는 길고 읽기가 어렵다.haskell에서 서로 다른 수준의 상호 작용
나는 이것을 모나드와 함께 시도했다. 나는 분리 된 모든 주 구성 요소를 하나의 유형으로 취급하려고 시도했지만, 그 때문에 가치를 만들어야하는 문제가 생겼습니다.
State Program() -- Represents the state of the processor after a single iteration of the fetch execute cycle
의미가있는 유일한 유형이었습니다. 그러나 그 시점에서 왜 귀찮게합니까? 내 복합 형에서 문자열을 당겨 I 실행 출력을 필요로한다는 사실을 제외하고, 좋은 일을 값
State Program' String
로 처리하여 그것을 깨는 시도했다. 내가 뭘 했든간에 나는 동시에 끈과 상태 모두를 견딜 수 없었다.
이제 모나드 변압기에 맞서려고 노력하고 있습니다. 나는 모든 다른 수준의 국가들을 분리해야만하는 것처럼 보인다. 하지만 내 머리가 빨리 폭발하고있다.
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 카운터에 넣지 않았습니다!
질문 :
- 오전 나는 곧 정상 궤도에?
- 모나드 변압기를 당겨보고있는 것처럼 "실행 출력"을 상태로 처리하는 것을 중지하고 IO 모나드로 손바닥을 그릴 수 있습니까? 그것은 멋지게 될 것입니다. 대신에 인쇄 할 수 있습니다.
- 얼마나 많은 레이어로 상태를 구분해야합니까? 두 개의 서로 다른 레이어를 볼 수는 있지만 서로 밀접하게 관련되어 있습니다 (메모리와 레지스터는 모두 메모리와 레지스터의 상태에 따라 다릅니다). 나는 그들을 하나의 상태로 유지하거나 그들을 분리하여 쌓아 두어야합니까? 어떤 방법으로 가장 가독성이 좋은 코드가 생성됩니까?
아마도 "출력 실행 중"은 Writer 모나드를 사용하여 가장 잘 표현 될 수 있습니다 (http://monads.haskell.cz/html/writermonad.html 참조). –