问题主要在标题中。这似乎是mfix可以为任何一元计算定义,即使它可能发散: mfix :: (a -> m a) -> m a
mfix f = fix (join . liftM f)
什么是错的这种结构?此外,为什么Monad和MonadFix类型类是分开的(即哪些类型的实例是Monad而不是MonadFix)?
使用ghc v8.0.1,使用-O2标志编译。 我遇到了RecursiveDo(mdo)的问题。有两个稍微不同的函数可以产生相同的输出,但它们不会。 下面的函数产生正确输出: proc2 :: Assembler()
proc2 = mdo
set (R 0) (I 0x5a5a)
let r = (R 0)
let bits = (I 2)
let co
更新:我已经添加了an answer,它描述了我的最终解决方案(提示:单个的Expr数据类型是不够的)。 我writing一点点表达式语言的评估,但是我卡上的LetRec结构。 这是语言: type Var = String
type Binds = [(Var, Expr)]
data Expr
= Var Var
| Lam Var Expr
| App