考虑到 monad,我想到了用 monad 来打破冯·诺依曼架构的方法。冯诺依曼架构使用一组指令(称为程序)来更改内存中的数据,并且程序的每条指令的执行都会更新程序计数器以了解下一个要执行的指令。
如果我们将冯·诺依曼架构视为一个 monad,则绑定运算符 (>>=) 会更新程序计数器。我们可以制作一个打破冯诺依曼架构的 Monad,以在绑定中做更多事情。举个例子,我们可以有一个 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
我注意到它会违反单子定律,例如:
return x >>= f /= f x
do
a <- return 3
return a
do
return 3
这两个块是相同的,因为单子定律,但它们会返回不同的东西,因为它们有不同数量的指令(句子)
我做错了什么吗?或者不可能有这样的 Monad 吗?
严格来说,任何这样的“单子”都违反了单子法则,因此……不是单子。看到这个上一个问题的详细信息。换句话说 - 你的猜测是正确的,不可能有这样的单子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)