Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch :
http://hackage.haskell.org/trac/ghc/changeset/802e6010b65d92c57db547aba6c7715631b2f729 >--------------------------------------------------------------- commit 802e6010b65d92c57db547aba6c7715631b2f729 Author: Max Bolingbroke <batterseapo...@hotmail.com> Date: Wed Oct 26 13:52:17 2011 +0100 Checkpoint intermediate DelayM refactoring >--------------------------------------------------------------- .../supercompile/Supercompile/Drive/Process2.hs | 39 +++++++++----------- 1 files changed, 18 insertions(+), 21 deletions(-) diff --git a/compiler/supercompile/Supercompile/Drive/Process2.hs b/compiler/supercompile/Supercompile/Drive/Process2.hs index de37efc..cc7c361 100644 --- a/compiler/supercompile/Supercompile/Drive/Process2.hs +++ b/compiler/supercompile/Supercompile/Drive/Process2.hs @@ -87,60 +87,57 @@ instance Traversable (DelayStructure sh) where -- If you don't want DelayM to have Monad structure, you can nuke the nested use of DelayM, -- and make some of the consumers simpler. I actually want this generalisation, though. -data DelayM q a r = Done r - | forall sh. Delayed (DelayStructure sh q) (DelayStructure sh a -> DelayM q a r) +data DelayM m a r = Done r + | forall sh. Delayed (DelayStructure sh (m (DelayM m a a))) (DelayStructure sh a -> DelayM m a r) -instance Functor (DelayM q a) where +instance Functor (DelayM m a) where fmap f x = pure f <*> x -instance Applicative (DelayM q a) where +instance Applicative (DelayM m a) where pure = return Done f <*> Done x = Done (f x) Delayed qs k <*> Done x = Delayed qs (\as -> k as <*> Done x) Done f <*> Delayed qs k = Delayed qs (\as -> Done f <*> k as) Delayed qs1 k1 <*> Delayed qs2 k2 = Delayed (Branch qs1 qs2) (\(Branch as1 as2) -> k1 as1 <*> k2 as2) -instance Monad (DelayM q a) where +instance Monad (DelayM m a) where return = Done Done x >>= fxmy = fxmy x Delayed qs k >>= fxmy = Delayed qs (\as -> k as >>= fxmy) -delay :: q -> DelayM q a a +delay :: m (DelayM m a a) -> DelayM m a a delay q = Delayed (Leaf q) (\(Leaf a) -> pure a) -runDelayM :: (Applicative memom, Monad memom) - => (DelayM q a r -> DelayM q a r) -- ^ Chooses the evaluation strategy - -> (q -> memom (DelayM q a a)) -- ^ How to answer questions in the monad (possibly generating new requests in the process) - -> DelayM q a r -> memom r -runDelayM choose_some sc = go +runDelayM :: (Applicative m, Monad m) + => (DelayM m a r -> DelayM m a r) -- ^ Chooses the evaluation strategy + -> DelayM m a r -> m r +runDelayM choose_some = go where go = go' . choose_some go' (Done x) = pure x - go' (Delayed qs k) = traverse sc qs >>= \fs -> go (sequenceA fs >>= k) + go' (Delayed qs k) = sequenceA qs >>= \fs -> go (sequenceA fs >>= k) -depthFirst :: DelayM q a r -> DelayM q a r +depthFirst :: DelayM m a r -> DelayM m a r depthFirst (Done x) = Done x depthFirst (Delayed qs k) = delayTail qs >>= k where - delayTail :: DelayStructure sh q -> DelayM q a (DelayStructure sh a) + delayTail :: DelayStructure sh (m (DelayM m a a)) -> DelayM m a (DelayStructure sh a) delayTail (Leaf q) = fmap Leaf (delay q) delayTail (Branch qs1 qs2) = liftM2 Branch (delayTail qs1) (traverse delay qs2) -breadthFirst :: DelayM q a r -> DelayM q a r +breadthFirst :: DelayM m a r -> DelayM m a r breadthFirst = id -type ScpM = DelayM State (Deeds, FVedTerm) +type ScpM = DelayM (MemoT HistoryM) (Deeds, FVedTerm) traceRenderScpM :: (Outputable a, Monad m) => String -> a -> m () traceRenderScpM msg x = pprTraceSC msg (pPrint x) $ return () -- TODO: include depth, refine to ScpM monad only -runScpM :: (Applicative m, Monad m) - => (State -> m (ScpM (Deeds, FVedTerm))) - -> m (ScpM a) -> m a -runScpM sc mx = mx >>= runDelayM eval_strat sc +runScpM :: MemoT HistoryM (ScpM a) -> MemoT HistoryM a +runScpM mx = mx >>= runDelayM eval_strat where --eval_strat = depthFirst eval_strat = breadthFirst @@ -234,5 +231,5 @@ sc = memo sc' . gc -- Garbage collection necessary because normalisation might h supercompile :: M.Map Var Term -> Term -> Term -supercompile unfoldings e = fVedTermToTerm $ snd $ runHistoryM $ runMemoT $ runScpM sc $ sc state +supercompile unfoldings e = fVedTermToTerm $ snd $ runHistoryM $ runMemoT $ runScpM $ sc state where state = prepareTerm unfoldings e _______________________________________________ Cvs-ghc mailing list Cvs-ghc@haskell.org http://www.haskell.org/mailman/listinfo/cvs-ghc