1
0
forked from GitHub/gf-core

refactor GF.Data.BacktrackM to use the MonadState and Functor classes

This commit is contained in:
krasimir
2009-04-14 08:07:33 +00:00
parent 8bd97f9e75
commit 63ccad9e85
3 changed files with 38 additions and 45 deletions

View File

@@ -261,7 +261,7 @@ evalTerm cnc_defs path x = error ("evalTerm ("++show x++")")
unifyPType :: FIndex -> FPath -> Term -> CnvMonad FIndex unifyPType :: FIndex -> FPath -> Term -> CnvMonad FIndex
unifyPType nr path (C max_index) = unifyPType nr path (C max_index) =
do (_, args, _, _) <- readState do (_, args, _, _) <- get
let (PFCat _ _ tcs,_) = args !! nr let (PFCat _ _ tcs,_) = args !! nr
case lookup path tcs of case lookup path tcs of
Just index -> return index 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 = gen_tcs (C max_index) path acc =
case List.lookup path tcs of case List.lookup path tcs of
Just index -> return $! addConstraint path index acc Just index -> return $! addConstraint path index acc
Nothing -> do writeState True Nothing -> do put True
index <- member [0..max_index] index <- member [0..max_index]
return $! addConstraint path index acc return $! addConstraint path index acc
where where
@@ -498,21 +498,21 @@ mkSelector rcs tcss =
-- updating the MCF rule -- updating the MCF rule
readArgCType :: FIndex -> CnvMonad Term readArgCType :: FIndex -> CnvMonad Term
readArgCType nr = do (_, _, _, ctypes) <- readState readArgCType nr = do (_, _, _, ctypes) <- get
return (ctypes !! nr) return (ctypes !! nr)
restrictArg :: FIndex -> FPath -> FIndex -> CnvMonad () restrictArg :: FIndex -> FPath -> FIndex -> CnvMonad ()
restrictArg nr path index = do 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 args' <- updateNthM (\(xcat,xs) -> do xcat <- restrictProtoFCat path index xcat
return (xcat,xs) ) nr args return (xcat,xs) ) nr args
writeState (head, args', ctype, ctypes) put (head, args', ctype, ctypes)
projectArg :: FIndex -> FPath -> CnvMonad Int projectArg :: FIndex -> FPath -> CnvMonad Int
projectArg nr path = do projectArg nr path = do
(head, args, ctype, ctypes) <- readState (head, args, ctype, ctypes) <- get
(xnr,args') <- updateArgs nr args (xnr,args') <- updateArgs nr args
writeState (head, args', ctype, ctypes) put (head, args', ctype, ctypes)
return xnr return xnr
where where
updateArgs :: FIndex -> [(ProtoFCat,[FPath])] -> CnvMonad (Int,[(ProtoFCat,[FPath])]) updateArgs :: FIndex -> [(ProtoFCat,[FPath])] -> CnvMonad (Int,[(ProtoFCat,[FPath])])
@@ -525,20 +525,20 @@ projectArg nr path = do
return (xnr,a:as) return (xnr,a:as)
readHeadCType :: CnvMonad Term readHeadCType :: CnvMonad Term
readHeadCType = do (_, _, ctype, _) <- readState readHeadCType = do (_, _, ctype, _) <- get
return ctype return ctype
restrictHead :: FPath -> FIndex -> CnvMonad () restrictHead :: FPath -> FIndex -> CnvMonad ()
restrictHead path term restrictHead path term
= do (head, args, ctype, ctypes) <- readState = do (head, args, ctype, ctypes) <- get
head' <- restrictProtoFCat path term head head' <- restrictProtoFCat path term head
writeState (head', args, ctype, ctypes) put (head', args, ctype, ctypes)
projectHead :: FPath -> CnvMonad () projectHead :: FPath -> CnvMonad ()
projectHead path projectHead path
= do (head, args, ctype, ctypes) <- readState = do (head, args, ctype, ctypes) <- get
head' <- projectProtoFCat path head head' <- projectProtoFCat path head
writeState (head', args, ctype, ctypes) put (head', args, ctype, ctypes)
restrictProtoFCat :: FPath -> FIndex -> ProtoFCat -> CnvMonad ProtoFCat restrictProtoFCat :: FPath -> FIndex -> ProtoFCat -> CnvMonad ProtoFCat
restrictProtoFCat path0 index0 (PFCat cat rcs tcs) = do restrictProtoFCat path0 index0 (PFCat cat rcs tcs) = do

View File

@@ -160,7 +160,7 @@ convertArg (C max) nr path lbl_path lin lins = do
restrictArg nr path index restrictArg nr path index
return lins return lins
convertArg (S _) nr path lbl_path lin lins = do convertArg (S _) nr path lbl_path lin lins = do
(_, args) <- readState (_, args) <- get
let PFCat _ cat rcs tcs = args !! nr let PFCat _ cat rcs tcs = args !! nr
l = index path rcs 0 l = index path rcs 0
sym | isLiteralCat cat = FSymLit nr l 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 -- eval a term to ground terms
evalTerm :: TermMap -> FPath -> Term -> CnvMonad FIndex 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 let PFCat _ _ _ tcs = args !! nr
rpath = reverse path rpath = reverse path
index <- member (fromMaybe (error "evalTerm: wrong path") (lookup rpath tcs)) 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 :: FIndex -> FPath -> FIndex -> CnvMonad ()
restrictArg nr path index = do restrictArg nr path index = do
(head, args) <- readState (head, args) <- get
args' <- updateNthM (restrictProtoFCat path index) nr args args' <- updateNthM (restrictProtoFCat path index) nr args
writeState (head, args') put (head, args')
restrictHead :: FPath -> FIndex -> CnvMonad () restrictHead :: FPath -> FIndex -> CnvMonad ()
restrictHead path term restrictHead path term
= do (head, args) <- readState = do (head, args) <- get
head' <- restrictProtoFCat path term head head' <- restrictProtoFCat path term head
writeState (head', args) put (head', args)
restrictProtoFCat :: FPath -> FIndex -> ProtoFCat -> CnvMonad ProtoFCat restrictProtoFCat :: FPath -> FIndex -> ProtoFCat -> CnvMonad ProtoFCat
restrictProtoFCat path0 index0 (PFCat n cat rcs tcs) = do restrictProtoFCat path0 index0 (PFCat n cat rcs tcs) = do

View File

@@ -13,24 +13,24 @@
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
{-# OPTIONS_GHC -fglasgow-exts #-} {-# OPTIONS_GHC -fglasgow-exts #-}
module GF.Data.BacktrackM ( -- * the backtracking state monad module GF.Data.BacktrackM (
-- * the backtracking state monad
BacktrackM, BacktrackM,
-- * controlling the monad
failure,
(|||),
-- * handling the state & environment
readState,
writeState,
-- * monad specific utilities -- * monad specific utilities
member, member,
cut,
-- * running the monad -- * running the monad
foldBM, runBM, foldBM, runBM,
foldSolutions, solutions, foldSolutions, solutions,
foldFinalStates, finalStates foldFinalStates, finalStates,
-- * reexport the 'MonadState' class
module Control.Monad.State.Class,
) where ) where
import Data.List import Data.List
import Control.Monad import Control.Monad
import Control.Monad.State.Class
---------------------------------------------------------------------- ----------------------------------------------------------------------
-- Combining endomorphisms and continuations -- 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 :: BacktrackM s () -> s -> [s]
finalStates bm = map fst . runBM bm 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 instance Monad (BacktrackM s) where
return a = BM (\c s b -> c a s b) 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) BM m >>= k = BM (\c s b -> m (\a s b -> unBM (k a) c s b) s b)
where unBM (BM m) = m where unBM (BM m) = m
fail _ = failure fail _ = mzero
-- * controlling the monad instance Functor (BacktrackM s) where
fmap f (BM m) = BM (\c s b -> m (\a s b -> c (f a) s b) s b)
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 MonadPlus (BacktrackM s) where instance MonadPlus (BacktrackM s) where
mzero = failure mzero = BM (\c s b -> b)
mplus = (|||) (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 -- * specific functions on the backtracking monad
member :: [a] -> BacktrackM s a member :: [a] -> BacktrackM s a
member xs = BM (\c s b -> foldl' (\b x -> c x s b) b xs) 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)