我正在阅读这篇论文在Haskell中使用类型化逻辑变量,但是我无法理解最终实现的细节。特别是第4节中介绍的回溯状态转换器。由于某种我不知道的原因,GHC认为我需要
我不确定问题出在哪里,也不知道如何解决。在这之前的讨论和代码中,我以为自己已经理解了,但显然我错了。如果有人能指出问题所在——我是否需要一个
(ST a)
的MonadPlus
实例,在下面的unify
函数中: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
或某种变体是适当的函数。我只是不知道适当的函数是什么。我想知道的是,我是否应该创建一个 MonadPlus (ST a)
实例,还是我没有使用正确的函数,误读了什么。
unify
的返回类型是LP s ()
或BackT (ST a) ()
。因此,显然MonadPlus
的BackT m
实例需要MonadPlus m
。你能在这里包含该实例吗? - Sjoerd Visscher