logict-state 0.1.0.4 → 0.1.0.5
raw patch · 3 files changed
+21/−21 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Control.Monad.LogicState: instance GHC.Base.Monad m => Control.Monad.LogicState.Class.MonadLogicState (gs, bs) (Control.Monad.LogicState.LogicStateT gs bs m)
+ Control.Monad.LogicState: instance GHC.Base.Monad m => Control.Monad.LogicState.Class.MonadLogicState (,) gs bs m (Control.Monad.LogicState.LogicStateT gs bs m)
+ Control.Monad.LogicState.Class: backtrackWithRoll :: MonadLogicState f gs bs ms m => (gs -> bs -> bs -> ms bs) -> m a -> m (m a)
- Control.Monad.LogicState: LogicStateT :: (forall r. LogicContS gs bs r m a) -> LogicStateT gs bs m a
+ Control.Monad.LogicState: LogicStateT :: forall r. LogicContS gs bs r m a -> LogicStateT gs bs m a
- Control.Monad.LogicState.Class: backtrack :: MonadLogicState s m => m a -> m (m a)
+ Control.Monad.LogicState.Class: backtrack :: MonadLogicState f gs bs ms m => m a -> m (m a)
- Control.Monad.LogicState.Class: class (MonadLogic m, MonadState s m) => MonadLogicState s m
+ Control.Monad.LogicState.Class: class (MonadLogic m, Monad ms, MonadState (f gs bs) m) => MonadLogicState f gs bs ms m | m -> ms
Files
- logict-state.cabal +1/−1
- src/Control/Monad/LogicState.hs +8/−18
- src/Control/Monad/LogicState/Class.hs +12/−2
logict-state.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: logict-state-version: 0.1.0.4+version: 0.1.0.5 synopsis: Library for logic programming based on haskell package logict description: Logic programming built on top of part of logict library, in particular for dealing with backtrackable state homepage: https://github.com/atzedijkstra/logict-state
src/Control/Monad/LogicState.hs view
@@ -115,26 +115,11 @@ instance TransLogicState (gs,bs) (LogicStateT gs bs) where observeT s lt = evalStateT (unLogicStateT lt (\a _ -> return a) (fail "No answer.")) s- - -- observeAllT s m = evalStateT (unLogicStateT m- -- (\a fk -> fk >>= \as -> return (a:as))- -- (return []))- -- s- + observeStateAllT s m = runStateT (unLogicStateT m (\a fk -> fk >>= \as -> return (a:as)) (return [])) s- - -- observeManyT s n m = evalStateT (obs n m) s- -- where- -- obs n m- -- | n <= 0 = return []- -- | n == 1 = unLogicStateT m (\a _ -> return [a]) (return [])- -- | otherwise = unLogicStateT (msplit m) sk (return [])- -- - -- sk Nothing _ = return []- -- sk (Just (a, m')) _ = StateT $ \s -> (\as -> (a:as,s)) `liftM` observeManyT s (n-1) m' observeStateManyT s n m = runStateT (obs n m) s where@@ -153,8 +138,13 @@ get = LogicStateT $ \sk fk -> get >>= \s -> sk s fk put s = LogicStateT $ \sk fk -> put s >>= \a -> sk a fk -instance (Monad m) => MonadLogicState (gs,bs) (LogicStateT gs bs m) where- backtrack m = get >>= \(_::gs,bs) -> return $ LogicStateT $ \sk fk -> StateT $ \(gs,_) -> runStateT (unLogicStateT m sk fk) (gs,bs)+instance (Monad m) => MonadLogicState (,) gs bs m (LogicStateT gs bs m) where+ backtrackWithRoll roll m = do+ (_,bs1) <- get+ return $ LogicStateT $ \sk fk ->+ StateT $ \(gs2,bs2) -> do+ bs <- roll gs2 bs2 bs1+ runStateT (unLogicStateT m sk fk) (gs2,bs) -------------------------------------------------------------------------
src/Control/Monad/LogicState/Class.hs view
@@ -11,11 +11,21 @@ ------------------------------------------------------------------------------- -- | API for MonadLogic which allows state and backtracking on it.-class (MonadLogic m, MonadState s m) => MonadLogicState s m where+class (MonadLogic m, Monad ms, MonadState (f gs bs) m) => MonadLogicState f gs bs ms m | m -> ms where -- | Return argument monad with the current backtrackable part of the state remembered. -- If the default def is not overridden this a no-op. -- This function complements 'mplus' for 'LogicT', 'mplus' backtracks on results, not on state, which is what this function should do.+ -- 'roll' accepts the end state of the backtrack attempt resp the state to backtrack to, returns to state to backtrack to.+ backtrackWithRoll+ :: (gs -> bs -> bs -> ms bs) -- ^ roll+ -> m a+ -> m (m a)+ backtrackWithRoll _ = backtrack+ + -- | special case of 'backtrackWith' backtrack :: m a -> m (m a)- backtrack = return+ backtrack = backtrackWithRoll (\_ _ bs -> return bs)+ +