---- According to section 7.3.5. Rebindable syntax in theuser's manual-- this should work (unless I totally misunderstood it).-- It doesn't.---- Compile with -fno-implicit-prelude---- Lennart--import Prelude hiding(Monad(..))class B a where b :: ainstance B Bool where b = Falseclass M m where return :: a -> m a (>>=) :: (B a) => m a -> (a -> m b) -> m b (>>) :: (B a) => m a -> m b -> m b fail :: String -> m a p >> q = p >>= \ _ -> q fail s = error sinstance M Maybe where return x = Just x (>>=) = error "bind"test :: Maybe Booltest = do x <- return True return (x && x)unJust (Just x) = xmain = print (unJust test)