是否可以创建一个计算指令数量的Monad?

Zhe*_*hen 7 monads haskell

考虑到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?

Tho*_*son 8

严格地说,任何这样的"monad"都违反了monad法则,因此......不是monad.看到这个的细节前的问题.换句话说 - 你的猜测是正确的,不可能有这样的monad.