2011-10-31 7 views
7

モナドについて考えてみると、フォンノイマン建築を破る方法としてモナドという考えが私に訪れました。フォンノイマンのアーキテクチャは、メモリ内のデータを変更するための命令セット(プログラムと呼ばれる)を使用し、プログラムの各命令の実行は、次に実行される命令が誰であるかを知るためにプログラムカウンタを更新する。命令数を数えるMonadを作成できますか?

Von Neumannアーキテクチャをモナドと考えると、バインド演算子(>> =)はプログラムカウンタを更新します。フォンノイマンの建築を壊してモナドを作り、バインドをもっと進めることができます。たとえば、プログラムで実行される命令の数を数えるMonadを使用できます。

return x >>= f   /= f x 

do 
    a <- return 3 
    return a 

do 
    return 3 

二つのブロック

が原因で同じです:私は例えば、それはデモナドの法律を破るよ気づく

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 

:私のようにHaskellでモナドことを実現しようとした

しかし、モナドの法則ですが、命令の数が異なるために異なるものが返されます

私は間違っていますか?またはそのようなMonadを持つことはできませんか?

+0

これは良い質問です。これを明確にするために書き直せますか?エラーのために読みにくいです。 –

+0

「返品」がカウントされないと、それは法律を破らないと思われます。 – fuz

+0

@Matt Fenwick、私は文法を修正するための質問を書き直します。 – Zhen

答えて

8

厳密に言えば、そのような「モナド」はモナド法を破るため、モナドではありません。このprevious question for detailsを参照してください。言い換えれば - あなたの推測は正しいです、そのようなモナドを持つことはできません。

1

実装では、fのステップ数がスローされます。あなたはそれらを追加してはいけませんか?

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

あなたは正しいですが、モナドの法律を修正するものではありません。それは(n1 + n2 + 1)でなければなりません。 – Zhen

関連する問題