
On 2010, July 18, 11:10
Iavor Diatchki
Hi, When using monadLib, I use newtype deriving to get the Functor, Applicative, and Monad instances for my custom newtyped monad. Those work just fine, and there is nothing unsafe about them.
For a custom monad, I usually don't derive MonadLib's effect classes directly. Instead, I tend to define new operations specific to the monad. This has the benefit of abstracting away internal implementation details, which makes it easier to change or extend the monad later. For example, to implement a monad which provides a source of unique identifiers, I might use a state transformer:
newtype MyMonad a = MyMonad (StateT Int ...)
Now, instead of deriving a "StateM" instance, I would define a custom operation for obtaining new names, something like this:
newName :: MyMonad Name newName = MyMonad (do x <- get; set (x + 1); return (mkName x))
Hello, and thanks for such quick answer. Your rationale showed me that deriving all possible instances is a wrong way, because it breaks abstraction. Somehow I didn't saw it. Moreover, now I suppose that "don't derive unnecessary instances" statement should be highlighted in Haskell wiki page about type classes/monads. -- Emil.