Tôi đang mô phỏng bộ vi xử lý 4 bit. Tôi cần phải theo dõi các thanh ghi, bộ nhớ và đầu ra đang chạy (các điểm thưởng để có bộ đếm chu trình tìm nạp). Tôi đã xoay sở để làm điều này mà không có monads, nhưng nó cảm thấy lộn xộn đi qua xung quanh nhiều thứ cùng một lúc một cách rõ ràng. Ngoài ra định nghĩa chức năng là lộn xộn, dài và khó đọc.Mức độ tương tác khác nhau của trạng thái trong haskell
Tôi đã cố gắng thực hiện điều này với các monads và nó không vừa với nhau. Tôi đã cố gắng xử lý tất cả các thành phần trạng thái riêng biệt dưới dạng một kiểu duy nhất, nhưng điều đó đã để lại cho tôi vấn đề về những gì tạo ra giá trị.
State Program() -- Represents the state of the processor after a single iteration of the fetch execute cycle
Là loại duy nhất có ý nghĩa. Nhưng tại thời điểm đó, tại sao lại bận tâm? Tôi cố gắng phá vỡ nó lên bằng cách kéo chuỗi ra loại hợp của tôi và đối xử với nó như là giá trị
State Program' String
mà làm việc lớn, ngoại trừ một thực tế rằng tôi cần đầu ra CHẠY. Không có vấn đề gì tôi đã làm tôi không thể giữ cho cả chuỗi và nhà nước cùng một lúc.
Bây giờ tôi đang cố gắng vật lộn với máy biến áp đơn nguyên. Có vẻ như tôi phải tách ra tất cả các cấp tiểu bang khác nhau. Nhưng đầu tôi đang bùng nổ nhanh.
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))))
Tôi thậm chí chưa đặt trong bộ đếm FEcycle!
Câu hỏi:
- Am tôi đi đúng hướng?
- Thấy như tôi đang kéo ra biến thế đơn nguyên bây giờ, là nó có thể ngừng điều trị "chạy đầu ra" như nhà nước và chỉ cần cọ nó ra để các đơn nguyên IO? Điều đó thật tuyệt vời, thay vì giữ nó, tôi chỉ có thể in nó.
- Tôi nên tách tiểu bang thành bao nhiêu lớp? Tôi có thể thấy hai lớp riêng biệt, nhưng chúng phụ thuộc chặt chẽ nhau (cả bộ nhớ và thanh ghi phụ thuộc vào trạng thái của cả bộ nhớ lẫn thanh ghi). Tôi có nên giữ chúng lại với nhau như một trạng thái duy nhất hoặc tách chúng ra và ngăn xếp chúng? Cách tiếp cận nào sẽ tạo ra mã dễ đọc nhất?
Có lẽ "đầu ra chạy" có thể được biểu diễn tốt nhất bằng cách sử dụng trình đơn Writer (xem http://monads.haskell.cz/html/writermonad.html)? –