我正在閱讀紙張Typed Logical Variables in Haskell,但我無法理解最終實現的細節。特別是,回溯狀態變壓器第4節介紹了由於某些原因,不認得我,GHC認爲我需要一個(ST a)
例如MonadPlus
在功能unify
,如下:需要MonadPlus(ST a)實例
newtype BackT m a = BT { run :: forall b . (a -> m [b]) -> m [b] }
instance (Monad m) => Monad (BackT m) where
return a = BT (\k -> k a)
BT m >>= f = BT (\k -> m (\a -> run (f a) k))
instance (MonadPlus m) => MonadPlus (BackT m) where
mzero = BT (\s -> mzero)
f `mplus` g = BT (\s -> (run f) s `mplus` (run g) s)
type LP a = BackT (ST a)
type LR = STRef
type Var s a = LR s (Maybe a)
data Atom s = VarA (Var s (Atom s)) | Atom String
class Unify b a | a -> b where
var :: a -> Maybe (Var b a)
unify :: a -> a -> LP s()
instance Unify s (Atom s) where
var (VarA a) = Just a
var _ = Nothing
unify (Atom a) (Atom b) | a == b = return() -- type checks
unify _ _ = mzero -- requires MonadPlus (ST a) instance
我不能確定是什麼問題是,以及如何解決它。我的印象是,在這之前我理解了前面的討論和代碼,但顯然我錯了。如果有人能指出什麼會出錯 - 我需要一個MonadPlus (ST a)
實例嗎? - 這將是非常有幫助的。
[編輯:澄清]我應該指出,作者出現聲稱mzero
到,或者在mzero
一些變化,是適當的函數。我只是不知道適當的功能是什麼。我想知道的是我是否應該創建一個MonadPlus (ST a)
實例,或者我沒有使用正確的函數,並且誤解了某些內容。
unify'的'返回類型爲'LP S()'或'BackT(ST一)()'。顯然,MonadPlus的'BackT m'實例需要'MonadPlus m'。你能在這裏包括那個實例嗎? –