diff options
| author | krasimir <krasimir@chalmers.se> | 2010-10-21 15:01:52 +0000 |
|---|---|---|
| committer | krasimir <krasimir@chalmers.se> | 2010-10-21 15:01:52 +0000 |
| commit | 822a70cf7a5971cc9d60239f98243bc1a07e12a5 (patch) | |
| tree | b336ae60bd56ed189e661b164c23b655ba396f4a /src/runtime/haskell/PGF/Generate.hs | |
| parent | 4f3b4bb19f1fb7f7d22ac52b230b7333a6a6c41d (diff) | |
change the TcM monad to continuation passing style. The old monad caused stack overflow for large search spaces
Diffstat (limited to 'src/runtime/haskell/PGF/Generate.hs')
| -rw-r--r-- | src/runtime/haskell/PGF/Generate.hs | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/src/runtime/haskell/PGF/Generate.hs b/src/runtime/haskell/PGF/Generate.hs index e79b6071f..f33ee10eb 100644 --- a/src/runtime/haskell/PGF/Generate.hs +++ b/src/runtime/haskell/PGF/Generate.hs @@ -47,7 +47,7 @@ generateFromDepth :: PGF -> Expr -> Maybe Int -> [Expr] generateFromDepth pgf e dp = [e | (_,_,e) <- snd $ runTcM (abstract pgf) (generateForMetas (prove dp) e) - () emptyMetaStore] + emptyMetaStore ()] -- | Generates an infinite list of random abstract syntax expressions. -- This is usefull for tree bank generation which after that can be used @@ -69,7 +69,7 @@ generateRandomFromDepth :: RandomGen g => g -> PGF -> Expr -> Maybe Int -> [Expr generateRandomFromDepth g pgf e dp = restart g (\g -> [e | (_,ms,e) <- snd $ runTcM (abstract pgf) (generateForMetas (prove dp) e) - (Identity g) emptyMetaStore]) + emptyMetaStore (Identity g)]) ------------------------------------------------------------------------------ @@ -79,7 +79,7 @@ generate :: Selector sel => sel -> PGF -> Type -> Maybe Int -> [Expr] generate sel pgf ty dp = [e | (_,ms,e) <- snd $ runTcM (abstract pgf) (prove dp emptyScope (TTyp [] ty) >>= checkResolvedMetaStore emptyScope) - sel emptyMetaStore] + emptyMetaStore sel] prove :: Selector sel => Maybe Int -> Scope -> TType -> TcM sel Expr prove dp scope (TTyp env1 (DTyp hypos1 cat es1)) = do @@ -150,10 +150,10 @@ instance Selector () where splitSelector s = (s,s) select cat scope dp = do gens <- typeGenerators scope cat - TcM (\abstr s ms -> iter ms gens) + TcM (\abstr k h -> iter k gens) where - iter ms [] = Zero - iter ms ((_,e,tty):fns) = Plus (Ok () ms (e,tty)) (iter ms fns) + iter k [] ms s = id + iter k ((_,e,tty):fns) ms s = k (e,tty) ms s . iter k fns ms s instance RandomGen g => Selector (Identity g) where @@ -162,13 +162,13 @@ instance RandomGen g => Selector (Identity g) where select cat scope dp = do gens <- typeGenerators scope cat - TcM (\abstr (Identity g) ms -> do_rand abstr g ms 1.0 gens) + TcM (\abstr k h -> iter k 1.0 gens) where - do_rand abstr g ms p [] = Zero - do_rand abstr g ms p gens = let (d,g') = randomR (0.0,p) g - (g1,g2) = split g' - (p',e_ty,gens') = hit d gens - in Plus (Ok (Identity g1) ms e_ty) (do_rand abstr g2 ms (p-p') gens') + iter k p [] ms (Identity g) = id + iter k p gens ms (Identity g) = let (d,g') = randomR (0.0,p) g + (g1,g2) = split g' + (p',e_ty,gens') = hit d gens + in k e_ty ms (Identity g1) . iter k (p-p') gens' ms (Identity g2) hit :: Double -> [(Double,Expr,TType)] -> (Double,(Expr,TType),[(Double,Expr,TType)]) hit d (gen@(p,e,ty):gens) |
