1 import Control.Monad.X.ReaderT
2 import Control.Monad.X.NondetT
3 import Control.Monad.X.Identity
5 t0,t1,t2 :: (MonadReader String m, MonadNondet m) => m String
6 t0 = local ('a':) mzero
7 t1 = (local ('a':) mzero) `mplus` ask
8 t2 = local ('a':) (mzero `mplus` ask)
11 run1 m = runIdentity $ runReader "x" $ runNondet $ m
12 run2 m = runIdentity $ runNondet $ runReader "x" $ m
14 test :: Eq a => (forall m. (MonadReader String m, MonadNondet m) => m a) -> Maybe a -> Bool
15 test t r = run1 t == r && run2 t == r
18 main = do print $ test t0 Nothing
19 print $ test t1 (Just "x")
20 print $ test t2 (Just "ax")