@@ -15,15 +15,15 @@ newtype DeclareT d m a = DeclareT { runDeclareT :: d -> m (d, a) }
1515instance (Monad m, Monoid d) => Applicative (DeclareT d m) where
1616 pure x = DeclareT (\_ -> pure (mempty, x))
1717 DeclareT df <*> DeclareT dx = DeclareT $ \d -> do
18− (d', f) <- df d
19− (d'', x) <- dx (d <> d')
18+ ~(d', f) <- df d
19+ ~(d'', x) <- dx (d <> d')
2020 return (d' <> d'', f x)
2121
2222instance (Monad m, Monoid d) => Monad (DeclareT d m) where
2323 return x = DeclareT (\_ -> pure (mempty, x))
2424 DeclareT dx >>= f = DeclareT $ \d -> do
25− (d', x) <- dx d
26− (d'', y) <- runDeclareT (f x) (d <> d')
25+ ~(d', x) <- dx d
26+ ~(d'', y) <- runDeclareT (f x) (d <> d')
2727 return (d' <> d'', y)
2828
2929instance Monoid d => MonadTrans (DeclareT d) where
@@ -46,6 +46,9 @@ evalDeclareT (DeclareT f) d = snd `liftM` f d
4646execDeclareT :: Monad m => DeclareT d m a -> d -> m d
4747execDeclareT (DeclareT f) d = fst `liftM` f d
4848
49+undeclareT :: (Monad m, Monoid d) => DeclareT d m a -> m a
50+undeclareT = flip evalDeclareT mempty
51+
4952type Declare d = DeclareT d Identity
5053
5154runDeclare :: Declare d a -> d -> (d, a)
@@ -57,3 +60,6 @@ evalDeclare m = runIdentity . evalDeclareT m
5760execDeclare :: Declare d a -> d -> d
5861execDeclare m = runIdentity . execDeclareT m
5962
63+undeclare :: Monoid d => Declare d a -> a
64+undeclare = runIdentity . undeclareT
65+