On 2010, July 18, 11:10 Iavor Diatchki <iavor.diatc...@gmail.com> wrote:
> 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. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe