import Control.Monad

main :: IO ()
main =
  runDelIO delegate [ print7, print6 ]

print6 :: DelIO ()
print6 =
  DelIO $ \ds -> print 6

print7 :: DelIO ()
print7 = do
  delegate
  DelIO $ \ds -> print 7
  delegate

type Dels = [ DelIO () ]

data DelIO b =
  DelIO { runDelIO :: Dels -> IO b }

delegate :: DelIO ()
delegate = DelIO $ \ds -> runDelIO ( head ds ) ( tail ds )

instance Monad DelIO where
  return x      = DelIO $ \ds -> return x
  DelIO x >>= f = DelIO $ \ds ->
    case x ds of
         io -> do v <- io
                  runDelIO ( f v ) ds
