モナドについて考えてみると、フォンノイマン建築を破る方法としてモナドという考えが私に訪れました。フォンノイマンのアーキテクチャは、メモリ内のデータを変更するための命令セット(プログラムと呼ばれる)を使用し、プログラムの各命令の実行は、次に実行される命令が誰であるかを知るためにプログラムカウンタを更新する。命令数を数える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を持つことはできませんか?
これは良い質問です。これを明確にするために書き直せますか?エラーのために読みにくいです。 –
「返品」がカウントされないと、それは法律を破らないと思われます。 – fuz
@Matt Fenwick、私は文法を修正するための質問を書き直します。 – Zhen