diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2006-06-01 10:12:38 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2006-06-01 10:12:38 +0000 |
| commit | f7d8cdfc2ec43984979a6c7dd1eacc221dd779ec (patch) | |
| tree | c12f67f4fb73f6f7e527ab6e62460179f939d3c6 | |
| parent | 34ca8208ac9ca06b2a5c1005cfab860e5697071d (diff) | |
Add foldBM, foldSolutions and foldFinalStates functions
| -rw-r--r-- | src/GF/Data/BacktrackM.hs | 106 |
1 files changed, 39 insertions, 67 deletions
diff --git a/src/GF/Data/BacktrackM.hs b/src/GF/Data/BacktrackM.hs index 29bfe0e10..736699c16 100644 --- a/src/GF/Data/BacktrackM.hs +++ b/src/GF/Data/BacktrackM.hs @@ -24,97 +24,69 @@ module GF.Data.BacktrackM ( -- * the backtracking state monad -- * monad specific utilities member, -- * running the monad - runBM, - solutions, - finalStates + foldBM, runBM, + foldSolutions, solutions, + foldFinalStates, finalStates ) where import Control.Monad ------------------------------------------------------------- --- type declarations - --- * controlling the monad - -failure :: BacktrackM s a -(|||) :: BacktrackM s a -> BacktrackM s a -> BacktrackM s a - -instance MonadPlus (BacktrackM s) where - mzero = failure - mplus = (|||) +---------------------------------------------------------------------- +-- Combining endomorphisms and continuations +-- a la Ralf Hinze --- * handling the state & environment +-- BacktrackM = state monad transformer over the backtracking monad -readState :: BacktrackM s s -writeState :: s -> BacktrackM s () +newtype BacktrackM s a = BM (forall b . (a -> s -> b -> b) -> s -> b -> b) --- * specific functions on the backtracking monad +-- * running the monad -member :: [a] -> BacktrackM s a -member = msum . map return +runBM :: BacktrackM s a -> s -> [(s,a)] +runBM (BM m) s = m (\x s xs -> (s,x) : xs) s [] --- * running the monad +foldBM :: (a -> s -> b -> b) -> b -> BacktrackM s a -> s -> b +foldBM f b (BM m) s = m f s b -runBM :: BacktrackM s a -> s -> [(s, a)] +foldSolutions :: (a -> b -> b) -> b -> BacktrackM s a -> s -> b +foldSolutions f b (BM m) s = m (\x s b -> f x b) s b solutions :: BacktrackM s a -> s -> [a] -solutions bm = map snd . runBM bm +solutions = foldSolutions (:) [] + +foldFinalStates :: (s -> b -> b) -> b -> BacktrackM s () -> s -> b +foldFinalStates f b (BM m) s = m (\x s b -> f s b) s b finalStates :: BacktrackM s () -> s -> [s] finalStates bm = map fst . runBM bm -{- ----------------------------------------------------------------------- --- implementation as lists of successes - -newtype BacktrackM s a = BM (s -> [(s, a)]) - -runBM (BM m) = m +-- * handling the state & environment -readState = BM (\s -> [(s, s)]) -writeState s = BM (\_ -> [(s, ())]) +readState :: BacktrackM s s +readState = BM (\c s b -> c s s b) -failure = BM (\s -> []) -BM m ||| BM n = BM (\s -> m s ++ n s) +writeState :: s -> BacktrackM s () +writeState s = BM (\c _ b -> c () s b) instance Monad (BacktrackM s) where - return a = BM (\s -> [(s, a)]) - BM m >>= k = BM (\s -> concat [ n s' | (s', a) <- m s, let BM n = k a ]) - fail _ = failure --} - ----------------------------------------------------------------------- --- Combining endomorphisms and continuations --- a la Ralf Hinze - -newtype Backtr a = B (forall b . (a -> b -> b) -> b -> b) - -instance Monad Backtr where - return a = B (\c f -> c a f) - B m >>= k = B (\c f -> m (\a -> unBacktr (k a) c) f) - where unBacktr (B m) = m - fail _ = failureB - -failureB = B (\c f -> f) -B m |||| B n = B (\c f -> m c (n c f)) - -runB (B m) = m (:) [] + return a = BM (\c s b -> c a s b) + BM m >>= k = BM (\c s b -> m (\a s b -> unBM (k a) c s b) s b) + where unBM (BM m) = m + fail _ = failure --- BacktrackM = state monad transformer over the backtracking monad +-- * controlling the monad -newtype BacktrackM s a = BM (s -> Backtr (s, a)) +failure :: BacktrackM s a +failure = BM (\c s b -> b) -runBM (BM m) s = runB (m s) +(|||) :: BacktrackM s a -> BacktrackM s a -> BacktrackM s a +(BM f) ||| (BM g) = BM (\c s b -> f c s (g c s b)) -readState = BM (\s -> return (s, s)) -writeState s = BM (\_ -> return (s, ())) +instance MonadPlus (BacktrackM s) where + mzero = failure + mplus = (|||) -failure = BM (\s -> failureB) -BM m ||| BM n = BM (\s -> m s |||| n s) +-- * specific functions on the backtracking monad -instance Monad (BacktrackM s) where - return a = BM (\s -> return (s, a)) - BM m >>= k = BM (\s -> do (s', a) <- m s ; unBM (k a) s') - where unBM (BM m) = m - fail _ = failure +member :: [a] -> BacktrackM s a +member = msum . map return |
