나는 Typed Logical Variables in Haskell이라는 글을 읽었으나 궁극적 인 구현 방법에 대해서는 자세히 이해하지 못했습니다. 내가 무슨 문제가 확실 해요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
: 특히, 나에게 알 수없는 몇 가지 이유를 들어 4 장에서 소개 되돌아 상태 변압기, GHC 내가 아래 기능 unify
에 (ST a)
에 대한 MonadPlus
인스턴스를 필요로 믿고 그리고 그것을 고치는 방법. 나는이 시점까지 선행 토론과 규범을 이해했다는 인상을 받았지만, 분명히 나는 착각했다. 누군가가 무엇이 잘못되었는지 지적 할 수 있다면 MonadPlus (ST a)
인스턴스가 필요한가요? - 도움이 될 것입니다.
는 [편집 : 명확한 설명은] 나는 저자 그 mzero
항에 나타나는 지적한다, 또는 mzero
에 약간의 변화는 적절한 기능입니다. 나는 단지 적절한 기능이 무엇인지 모른다. 내가 궁금한 것은 내가 MonadPlus (ST a)
인스턴스를 만들 것인지 아니면 올바른 함수를 사용하지 않고 뭔가 잘못 읽었는지 여부입니다.
)()'. 그래서 'MonadPlus'의'BackTm' 인스턴스는'MonadPlus m'을 필요로합니다. 그 인스턴스를 여기에 포함시킬 수 있습니까? –