On Sat, Oct 17, 2009 at 3:24 PM, Andrew Coppin <andrewcop...@btinternet.com> wrote: > Edward Z. Yang wrote: >> >> Excerpts from Andrew Coppin's message of Sat Oct 17 15:21:28 -0400 2009: >> >>> >>> 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. >>> >> >> A proper monad obeys the monad laws: >> >> http://www.haskell.org/haskellwiki/Monad_Laws >> >> You can probably cook up some quickcheck properties to test for these, >> but really you should be able to convince yourself by inspection that >> your monad follows these laws. >> > > I'm reasonably confident it works, but not 100% sure... > > newtype Foo x = Foo (M -> IO x)
In this case it is trivial, Foo = ReaderT M IO which is a monad. If you want, you can verify for yourself that this is a monad. It isn't, however, uncommon for custom monads to be (equivalent to) stacks of monad transformers. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe