module Foo where
import Prelude hiding (Monad (..))
import qualified Prelude as P
data MyMonad m a b = MyMonad
{ (>>=) :: m a -> (a -> m b) -> m b
, (>>) :: m a -> m b -> m b
, return :: a -> m a
, fail :: String -> m a
}
ioMonad :: MyMonad IO a b
ioMonad = MyMonad (P.>>=) (P.>>) P.return P.fail
{-# OPTIONS -fno-warn-name-shadowing #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE RebindableSyntax #-}
module Bar where
import Prelude
import qualified Foo
normalDo :: Monad m => m ()
normalDo = do
return ()
-- Inferred: ioDo :: IO ()
ioDo = do
return ()
where Foo.MyMonad{..} = Foo.ioMonad