2011-10-31 97 views
7

關於monad的思考,它讓我想到monad作爲打破馮諾依曼架構的方式。馮諾依曼體系結構使用一組指令(稱爲程序)來改變存儲器中的數據,並且程序的每個指令的執行都更新程序計數器以知道下一個要執行的指令。是否可以創建一個計算指令數量的Monad?

如果我們將馮諾依曼體系結構看作單子,綁定操作符(>> =)會更新程序計數器。我們可以製造一個打破馮諾依曼體系結構的Monad,在綁定中做更多的事情。作爲一個例子,我們可以有一個Monad來計算在我們的程序中執行的指令的數量。

但是,當我試圖實現一個單子在Haskell爲:

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 

我注意到它會打破德單子法律,例如:

return x >>= f   /= f x 

do 
    a <- return 3 
    return a 

do 
    return 3 

兩個塊是相同的,因爲單子法,但他們會返回不同的東西,因爲他們有不同數量的指令(句子)

我做錯了什麼?還是不可能有這樣的Monad?

+0

這是一個很好的問題,你可以改寫,使其更清楚嗎?由於錯誤,有點難以閱讀。 –

+0

好吧,如果「返回」不算,它似乎不會違反這些法律。 – fuz

+0

@Matt Fenwick,我重寫了這個問題來修復語法。 – Zhen

回答

8

嚴格地說,任何這樣的「monad」打破monad法則,因此......不是monad。看到這個previous question for details。換句話說 - 你的猜測是正確的,不可能有這樣一個單子。

1

您的實現拋棄了f中的步驟數。你不應該添加它們嗎?

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

你是對的,但它不能解決monad法則。它應該是(n1 + n2 + 1)。 – Zhen

相關問題