問題主要在標題中。這似乎是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