Typed Logical Variables in Haskellという論文を読んでいますが、最終的な実装の詳細を理解できていません。特に、セクション 4 で導入されたバックトラッキング状態トランスフォーマーです。何らかの理由で、私にはわかりませんが、GHC は、以下の functionに のMonadPlus
インスタンスが必要であると考えています。(ST a)
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
は、または のバリエーションmzero
が適切な関数であると主張しているように見えることを指摘しておくべきでした。私は適切な機能が何であるかを知りません。私が疑問に思っているのは、MonadPlus (ST a)
インスタンスを作成することになっているのか、それとも正しい関数を使用していないのか、何かを読み違えてしまったのかということです。