I'm having a problem with a simple monad transformer stack that has me stumped. Here's the sample code:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

import Control.Monad.Error
import Control.Monad.State
import Data.Typeable

data SomeError =
    Error1
  | Error2
  | ErrorFail
  deriving (Eq, Show, Typeable)

data MyData a = MyData [a]

instance Error SomeError where
  noMsg = ErrorFail

{- This works: -}
{-
newtype StateError e s a =
  StateError ((StateT s (Either e) a))
  deriving (Monad,
            MonadState s,
            MonadError e,
            Typeable)

type MyMonad a = StateError SomeError (MyData a) a
-}

{- This doesn't work: -}
newtype MyMonad a =
  MyMonad ((StateT (MyData a) (Either SomeError) a))
  deriving (Monad,
            MonadState (MyData a),
            MonadError SomeError,
            Typeable)

----------

Basically, the more abstracted (commented-out) version works, but the more specific one gives this error:

Weird.hs:33:12:
    Can't make a derived instance of `Monad MyMonad'
      (even with cunning newtype deriving):
      cannot eta-reduce the representation type enough
    In the newtype declaration for `MyMonad'

Weird.hs:34:12:
    Cannot eta-reduce to an instance of form
      instance (...) => MonadState (MyData a) MyMonad
    In the newtype declaration for `MyMonad'

Weird.hs:35:12:
    Can't make a derived instance of `MonadError SomeError MyMonad'
      (even with cunning newtype deriving):
      cannot eta-reduce the representation type enough
    In the newtype declaration for `MyMonad'

These error messages mean nothing to me. What's going on? Can the more specific code be made to work? This is with ghc 6.12.3.

Thanks,

Mike




_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to