2011-10-31 34 views
7

Suy nghĩ về đơn nguyên, nó đã đến với tôi ý tưởng về một đơn nguyên như là cách để phá vỡ với kiến ​​trúc Von Neumann. Kiến trúc Von Neumann sử dụng một bộ các lệnh (được gọi là chương trình) để thay đổi dữ liệu trong bộ nhớ và việc thực thi mỗi lệnh của chương trình cập nhật một bộ đếm chương trình để biết lệnh nào là lệnh tiếp theo để thực thi.Có thể tạo một Monad đếm số hướng dẫn không?

Nếu chúng ta nghĩ về kiến ​​trúc Von Neumann như một đơn nguyên, toán tử liên kết (>> =) cập nhật bộ đếm chương trình. Chúng ta có thể tạo ra một Monad phá vỡ kiến ​​trúc Von Neumann để làm được nhiều hơn trong sự ràng buộc. Ví dụ, chúng ta có thể có một Monad đếm số lượng lệnh được thực thi trong các chương trình của chúng ta.

Tuy nhiên, khi tôi cố gắng thực hiện điều đó đơn nguyên trong Haskell như:

data Counter a = Counter Integer a 
      deriving(Show) 

instance Monad Counter where 
    (Counter n1 a) >>= f = let Counter _ b = f a 
        in (Counter (n1+1) b) 
    return a = Counter 1 a 

Tôi nhận thấy nó sẽ phá vỡ de Monads luật, ví dụ:

return x >>= f   /= f x 

do 
    a <- return 3 
    return a 

do 
    return 3 

Hai khối đều giống nhau vì luật đơn nguyên, nhưng họ sẽ trả về một cái gì đó khác biệt vì họ có số lượng hướng dẫn khác nhau (câu)

Tôi đã làm gì sai? hoặc là không thể có Monad như vậy?

+0

Đây là câu hỏi hay, bạn có thể viết lại để làm rõ hơn không? Hơi khó đọc vì lỗi. –

+0

Vâng, có vẻ như nó sẽ không phá vỡ luật đó, nếu 'return's không được tính. – fuz

+0

@ Fen Fenwick, tôi viết lại câu hỏi để sửa ngữ pháp. – Zhen

Trả lời

8

Nói đúng ra, bất kỳ "đơn nguyên" nào đó vi phạm luật đơn nguyên và do đó ... không phải là một đơn nguyên. Xem này previous question for details. Nói cách khác - đoán của bạn là chính xác, nó không thể có một đơn nguyên như vậy.

1

Việc triển khai của bạn sẽ loại bỏ số bước trong f. Bạn không nên thêm chúng?

(Counter n1 a) >>= f = let Counter n2 b = f a 
        in (Counter (n1+n2) b) 
+0

Bạn nói đúng, nhưng nó không sửa các luật đơn lẻ. Nó phải là (n1 + n2 + 1). – Zhen

Các vấn đề liên quan