考虑到monad,我想到了monad作为打破Von Neumann架构的方法.冯·诺依曼架构使用一组指令(称为程序)来改变存储器中的数据,并且程序的每个指令的执行更新程序计数器以知道下一个执行的指令.
如果我们将Von Neumann体系结构视为monad,则绑定运算符(>> =)更新程序计数器.我们可以让Monad打破Von Neumann架构,在绑定中做更多事情.作为一个例子,我们可以有一个Monad来计算我们程序中执行的指令数.
但是,当我试图在haskell中实现Monad时:
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
Run Code Online (Sandbox Code Playgroud)
我注意到它会打破de Monads法律,例如:
return x >>= f /= f x
do
a <- return 3
return a
do
return 3
Run Code Online (Sandbox Code Playgroud)
这两个块是相同的,因为monad定律,但它们会返回不同的东西,因为它们有不同数量的指令(句子)
我做错了吗?或者不可能有这样的Monad?