Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : supercompiler

http://hackage.haskell.org/trac/ghc/changeset/d17c607dd53726c29e2094d072a7285972515f07

>---------------------------------------------------------------

commit d17c607dd53726c29e2094d072a7285972515f07
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Wed Oct 26 17:46:54 2011 +0100

    Fulfilments in Process2 (well, it typechecks)

>---------------------------------------------------------------

 .../supercompile/Supercompile/Drive/Process2.hs    |   97 +++++++++++++++-----
 1 files changed, 72 insertions(+), 25 deletions(-)

diff --git a/compiler/supercompile/Supercompile/Drive/Process2.hs 
b/compiler/supercompile/Supercompile/Drive/Process2.hs
index 694b3fb..91f5ed7 100644
--- a/compiler/supercompile/Supercompile/Drive/Process2.hs
+++ b/compiler/supercompile/Supercompile/Drive/Process2.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE GADTs #-}
+{-# LANGUAGE GADTs, ScopedTypeVariables #-}
 module Supercompile.Drive.Process2 () where
 
 import Supercompile.Drive.Match
@@ -171,6 +171,51 @@ runHistoryM :: HistoryM a -> a
 runHistoryM = flip State.evalState (mkHistory (cofmap fst wQO))
 -}
 
+
+newtype StateT s m a = ST { unST :: s -> m (a, s) }
+
+instance Functor m => Functor (StateT s m) where
+    fmap f mx = ST $ \s -> fmap (first f) (unST mx s)
+
+instance (Functor m, Monad m) => Applicative (StateT s m) where
+    pure = return
+    (<*>) = ap
+
+instance Monad m => Monad (StateT s m) where
+    return x = ST $ \s -> return (x, s)
+    mx >>= fxmy = ST $ \s -> unST mx s >>= \(x, s) -> unST (fxmy x) s
+
+liftStateT :: Functor m => m a -> StateT s m a
+liftStateT mx = ST $ \s -> fmap (flip (,) s) mx
+
+delayStateT :: Functor m => m (StateT s (DelayM m) a) -> StateT s (DelayM m) a
+delayStateT mx = ST $ \s -> delay (fmap (($ s) . unST) mx)
+
+{-
+-- NB: you can't implement this for all monad transformers
+-- (in particular the continuation monad transformer).
+-- But if you can, we can derive a delayStateT equivalent from it:
+fiddle :: (forall b. m b -> n b)
+       -> StateT s m a -> StateT s n a
+fiddle f mx = ST $ \s -> f (unST mx s)
+
+
+lifty :: Monad m => m a -> DelayM m a
+lifty = delay . liftM return
+
+mx                                  :: m (StateT s (DelayM m) a)
+liftStateT mx                       :: StateT s m (StateT s (DelayM m) a)
+fiddle lifty                        :: forall a. Monad m => StateT s m a -> 
StateT s (DelayM m) a
+fiddle lifty (liftStateT mx)        :: Monad m => StateT s (DelayM m) (StateT 
s (DelayM m) a)
+join (fiddle lifty (liftStateT mx)) :: Monad m => StateT s (DelayM m) a
+
+Therefore:
+
+delayStateT :: Monad m => m (StateT s (DelayM m) a) -> StateT s (DelayM m) a
+delayStateT = join . fiddle lifty . liftStateT
+-}
+
+
 data Promise = P {
     fun        :: Var,      -- Name assigned in output program
     abstracted :: [AbsVar], -- Abstracted over these variables
@@ -178,29 +223,31 @@ data Promise = P {
   }
 
 data MemoState = MS {
-    promises :: [Promise], -- FIXME: fulfilments
+    promises :: [Promise],
     hNames   :: Stream Name
   }
 
-newtype MemoT m a = MT { unMT :: MemoState -> m (a, MemoState) }
-
-instance Functor m => Functor (MemoT m) where
-    fmap f mx = MT $ \s -> fmap (first f) (unMT mx s)
-
-instance (Functor m, Monad m) => Applicative (MemoT m) where
-    pure = return
-    (<*>) = ap
-
-instance Monad m => Monad (MemoT m) where
-    return x = MT $ \s -> return (x, s)
-    mx >>= fxmy = MT $ \s -> unMT mx s >>= \(x, s) -> unMT (fxmy x) s
+type MemoT = StateT MemoState
 
 runMemoT :: Functor m => MemoT m a -> m a
-runMemoT mx = fmap fst $ unMT mx MS { promises = [], hNames = h_names }
+runMemoT mx = fmap fst $ unST mx MS { promises = [], hNames = h_names }
   where h_names = listToStream $ zipWith (\i uniq -> mkSystemVarName uniq 
(mkFastString ('h' : show (i :: Int))))
                                          [1..] (uniqsFromSupply 
hFunctionsUniqSupply)
 
 
+newtype FulfilmentState = FS {
+    fulfilments :: [(Var, FVedTerm)]
+  }
+
+type FulfilmentT = StateT FulfilmentState
+
+fulfill :: Monad m => Promise -> (Deeds, FVedTerm) -> FulfilmentT m (Deeds, 
FVedTerm)
+fulfill p (deeds, e_body) = ST $ \fs -> return ((deeds, e_body), FS { 
fulfilments = (fun p, tyVarIdLambdas (abstracted p) e_body) : fulfilments fs })
+
+runFulfilmentT :: Monad m => FulfilmentT m FVedTerm -> m FVedTerm
+runFulfilmentT mx = liftM (\(e, fs) -> letRec (fulfilments fs) e) $ unST mx 
(FS { fulfilments = [] })
+
+
 promise :: State -> MemoState -> (Promise, MemoState)
 promise state ms = (p, ms)
   where vs_list = stateAbsVars state
@@ -216,13 +263,13 @@ promise state ms = (p, ms)
             hNames   = h_names'
           }
 
-instance MonadStatics (DelayM (MemoT HistoryM)) where
+instance MonadStatics (FulfilmentT ScpM) where
     -- FIXME
 
 memo :: (Applicative t, Monad m)
-     => (State -> t (m (Deeds, Out FVedTerm)))
-     -> State -> MemoT t (m (Deeds, Out FVedTerm))
-memo opt state = MT $ \ms ->
+     => (State -> t (FulfilmentT m (Deeds, Out FVedTerm)))
+     -> State -> MemoT t (FulfilmentT m (Deeds, Out FVedTerm))
+memo opt state = ST $ \ms ->
      -- NB: If tb contains a dead PureHeap binding (hopefully impossible) then 
it may have a free variable that
      -- I can't rename, so "rename" will cause an error. Not observed in 
practice yet.
     case [ (p, (releaseStateDeed state, var (fun p) `applyAbsVars` map 
(renameAbsVar rn_lr) (abstracted p)))
@@ -235,21 +282,21 @@ memo opt state = MT $ \ms ->
                                    (do { traceRenderScpM ">sc" (fun p, 
PrettyDoc (pPrintFullState True state))
                                        ; res <- mres
                                        ; traceRenderScpM "<sc" (fun p, 
PrettyDoc (pPrintFullState False state), res)
-                                       ; return res }, ms')
+                                       ; fulfill p res }, ms')
                 where (p, ms') = promise state ms
 
 
 type RollbackScpM = () -- Generaliser -> ScpBM (Deeds, Out FVedTerm)
 
-sc' :: State -> HistoryM (ScpM (Deeds, Out FVedTerm))
+sc' :: State -> HistoryM (FulfilmentT ScpM (Deeds, Out FVedTerm))
 sc' state = \hist -> case terminate hist (state, ()) of
-                       Continue hist'             -> split (snd $ reduce 
state) (delay . sc) -- FIXME: use hist'
-                       Stop (shallower_state, ()) -> maybe (split state) id 
(generalise (mK_GENERALISER shallower_state state) state) (delay . sc)
+                       Continue hist'             -> split (snd $ reduce 
state) (delayStateT . sc) -- FIXME: use hist'
+                       Stop (shallower_state, ()) -> maybe (split state) id 
(generalise (mK_GENERALISER shallower_state state) state) (delayStateT . sc)
 
-sc :: State -> MemoT HistoryM (ScpM (Deeds, Out FVedTerm))
+sc :: State -> MemoT HistoryM (FulfilmentT ScpM (Deeds, Out FVedTerm))
 sc = memo sc' . gc -- Garbage collection necessary because normalisation might 
have made some stuff dead
 
 
 supercompile :: M.Map Var Term -> Term -> Term
-supercompile unfoldings e = fVedTermToTerm $ snd $ runHistoryM $ runMemoT $ 
runScpM $ sc state
+supercompile unfoldings e = fVedTermToTerm $ runHistoryM $ runMemoT $ runScpM 
$ liftM (runFulfilmentT . fmap snd) $ sc state
   where state = prepareTerm unfoldings e



_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to