Suppose we have newtype Foo x instance Monad Foo runFoo :: Foo x -> IO x What sort of things can I do to check that I actually implemented this correctly? I mean, ignoring what makes Foo special for a moment, how can I check that it works correctly as a monad.