【发布时间】:2011-10-06 22:55:17
【问题描述】:
我正在阅读论文Typed Logical Variables in Haskell,但我无法理解最终实现的细节。特别是第 4 节中介绍的回溯状态转换器。出于某种我不知道的原因,GHC 认为我需要在函数unify 中为(ST a) 提供MonadPlus 实例,如下所示:
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 a) ()。所以显然BackT m的MonadPlus实例需要MonadPlus m。您能在此处包含该实例吗?
标签: haskell monad-transformers unification st-monad monadplus