From 8b4c8651999072d6648e25c4c0bdefb522bff96f Mon Sep 17 00:00:00 2001 From: krasimir Date: Tue, 14 Apr 2009 08:07:33 +0000 Subject: [PATCH] refactor GF.Data.BacktrackM to use the MonadState and Functor classes --- src/GF/Compile/GenerateFCFG.hs | 24 ++++++++--------- src/GF/Compile/GeneratePMCFG.hs | 12 ++++----- src/GF/Data/BacktrackM.hs | 47 ++++++++++++++------------------- 3 files changed, 38 insertions(+), 45 deletions(-) diff --git a/src/GF/Compile/GenerateFCFG.hs b/src/GF/Compile/GenerateFCFG.hs index 108976506..a0f82218c 100644 --- a/src/GF/Compile/GenerateFCFG.hs +++ b/src/GF/Compile/GenerateFCFG.hs @@ -261,7 +261,7 @@ evalTerm cnc_defs path x = error ("evalTerm ("++show x++")") unifyPType :: FIndex -> FPath -> Term -> CnvMonad FIndex unifyPType nr path (C max_index) = - do (_, args, _, _) <- readState + do (_, args, _, _) <- get let (PFCat _ _ tcs,_) = args !! nr case lookup path tcs of Just index -> return index @@ -390,7 +390,7 @@ genFCatArg cnc_defs ctype env@(GrammarEnv last_id catSet seqSet funSet prodSet) gen_tcs (C max_index) path acc = case List.lookup path tcs of Just index -> return $! addConstraint path index acc - Nothing -> do writeState True + Nothing -> do put True index <- member [0..max_index] return $! addConstraint path index acc where @@ -498,21 +498,21 @@ mkSelector rcs tcss = -- updating the MCF rule readArgCType :: FIndex -> CnvMonad Term -readArgCType nr = do (_, _, _, ctypes) <- readState +readArgCType nr = do (_, _, _, ctypes) <- get return (ctypes !! nr) restrictArg :: FIndex -> FPath -> FIndex -> CnvMonad () restrictArg nr path index = do - (head, args, ctype, ctypes) <- readState + (head, args, ctype, ctypes) <- get args' <- updateNthM (\(xcat,xs) -> do xcat <- restrictProtoFCat path index xcat return (xcat,xs) ) nr args - writeState (head, args', ctype, ctypes) + put (head, args', ctype, ctypes) projectArg :: FIndex -> FPath -> CnvMonad Int projectArg nr path = do - (head, args, ctype, ctypes) <- readState + (head, args, ctype, ctypes) <- get (xnr,args') <- updateArgs nr args - writeState (head, args', ctype, ctypes) + put (head, args', ctype, ctypes) return xnr where updateArgs :: FIndex -> [(ProtoFCat,[FPath])] -> CnvMonad (Int,[(ProtoFCat,[FPath])]) @@ -525,20 +525,20 @@ projectArg nr path = do return (xnr,a:as) readHeadCType :: CnvMonad Term -readHeadCType = do (_, _, ctype, _) <- readState +readHeadCType = do (_, _, ctype, _) <- get return ctype restrictHead :: FPath -> FIndex -> CnvMonad () restrictHead path term - = do (head, args, ctype, ctypes) <- readState + = do (head, args, ctype, ctypes) <- get head' <- restrictProtoFCat path term head - writeState (head', args, ctype, ctypes) + put (head', args, ctype, ctypes) projectHead :: FPath -> CnvMonad () projectHead path - = do (head, args, ctype, ctypes) <- readState + = do (head, args, ctype, ctypes) <- get head' <- projectProtoFCat path head - writeState (head', args, ctype, ctypes) + put (head', args, ctype, ctypes) restrictProtoFCat :: FPath -> FIndex -> ProtoFCat -> CnvMonad ProtoFCat restrictProtoFCat path0 index0 (PFCat cat rcs tcs) = do diff --git a/src/GF/Compile/GeneratePMCFG.hs b/src/GF/Compile/GeneratePMCFG.hs index 6a5f9ebdf..0ae32d483 100644 --- a/src/GF/Compile/GeneratePMCFG.hs +++ b/src/GF/Compile/GeneratePMCFG.hs @@ -160,7 +160,7 @@ convertArg (C max) nr path lbl_path lin lins = do restrictArg nr path index return lins convertArg (S _) nr path lbl_path lin lins = do - (_, args) <- readState + (_, args) <- get let PFCat _ cat rcs tcs = args !! nr l = index path rcs 0 sym | isLiteralCat cat = FSymLit nr l @@ -190,7 +190,7 @@ convertRec cnc_defs (index:sub_sel) ctype record lbl_path lin lins = do -- eval a term to ground terms evalTerm :: TermMap -> FPath -> Term -> CnvMonad FIndex -evalTerm cnc_defs path (V nr) = do (_, args) <- readState +evalTerm cnc_defs path (V nr) = do (_, args) <- get let PFCat _ _ _ tcs = args !! nr rpath = reverse path index <- member (fromMaybe (error "evalTerm: wrong path") (lookup rpath tcs)) @@ -349,15 +349,15 @@ getFCats (GrammarEnv last_id catSet seqSet funSet crcSet prodSet) (PFCat n cat r restrictArg :: FIndex -> FPath -> FIndex -> CnvMonad () restrictArg nr path index = do - (head, args) <- readState + (head, args) <- get args' <- updateNthM (restrictProtoFCat path index) nr args - writeState (head, args') + put (head, args') restrictHead :: FPath -> FIndex -> CnvMonad () restrictHead path term - = do (head, args) <- readState + = do (head, args) <- get head' <- restrictProtoFCat path term head - writeState (head', args) + put (head', args) restrictProtoFCat :: FPath -> FIndex -> ProtoFCat -> CnvMonad ProtoFCat restrictProtoFCat path0 index0 (PFCat n cat rcs tcs) = do diff --git a/src/GF/Data/BacktrackM.hs b/src/GF/Data/BacktrackM.hs index 790d11a83..36317ebb6 100644 --- a/src/GF/Data/BacktrackM.hs +++ b/src/GF/Data/BacktrackM.hs @@ -13,24 +13,24 @@ ----------------------------------------------------------------------------- {-# OPTIONS_GHC -fglasgow-exts #-} -module GF.Data.BacktrackM ( -- * the backtracking state monad +module GF.Data.BacktrackM ( + -- * the backtracking state monad BacktrackM, - -- * controlling the monad - failure, - (|||), - -- * handling the state & environment - readState, - writeState, -- * monad specific utilities member, + cut, -- * running the monad foldBM, runBM, foldSolutions, solutions, - foldFinalStates, finalStates + foldFinalStates, finalStates, + + -- * reexport the 'MonadState' class + module Control.Monad.State.Class, ) where import Data.List import Control.Monad +import Control.Monad.State.Class ---------------------------------------------------------------------- -- Combining endomorphisms and continuations @@ -60,34 +60,27 @@ 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 - --- * handling the state & environment - -readState :: BacktrackM s s -readState = BM (\c s b -> c s s b) - -writeState :: s -> BacktrackM s () -writeState s = BM (\c _ b -> c () s b) - instance Monad (BacktrackM s) where 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 + fail _ = mzero --- * controlling the monad - -failure :: BacktrackM s a -failure = BM (\c s b -> b) - -(|||) :: BacktrackM s a -> BacktrackM s a -> BacktrackM s a -(BM f) ||| (BM g) = BM (\c s b -> g c s $! f c s b) +instance Functor (BacktrackM s) where + fmap f (BM m) = BM (\c s b -> m (\a s b -> c (f a) s b) s b) instance MonadPlus (BacktrackM s) where - mzero = failure - mplus = (|||) + mzero = BM (\c s b -> b) + (BM f) `mplus` (BM g) = BM (\c s b -> g c s $! f c s b) + +instance MonadState s (BacktrackM s) where + get = BM (\c s b -> c s s b) + put s = BM (\c _ b -> c () s b) -- * specific functions on the backtracking monad member :: [a] -> BacktrackM s a member xs = BM (\c s b -> foldl' (\b x -> c x s b) b xs) + +cut :: BacktrackM s a -> BacktrackM s [(s,a)] +cut f = BM (\c s b -> c (runBM f s) s b)