Skip to content

"Var.tcTyVarDetails" exception w/ Assoc. Datatypes and Monad Transformers

Summary:

When trying to build a monad stack which involves a state transformer with a constrained state, the newtype which constrains said state (below, it is the Filter newtype) cannot seem to derive something within the list of things it's intended to derive. After some testing I found that changing the MonadState Bool part of the deriving clause to MonadState t (in line with the actual state parameter) made everything work. The Type of Email doesn't matter, I've tested to this effect (replacing Email with data Email = Email and not importing the real version, it still compiles fine in the fixed case, and does not compile in the broken case).

I have not tested on GHC 6.12 yet, I'm still trying to install it. All other system information at the bottom.

By the looks of it, this is a case of GHC not noticing I'm doing something silly, and not reporting something along the lines of the "This isn't polymorphic enough" error.

Broken Code:

type Context = ReaderT Email
type Match t = StateT t IO
type ContextMatch t a = Context (Match t) a

newtype FilterState t => Filter t a = Filter (ContextMatch t a)
      deriving (Functor, Monad, MonadReader Email, MonadState Bool, MonadIO)

class FilterState t where
       data FState t
       deliver :: FState t -> IO ()

Error:

[1 of 3] Compiling Network.HackMail.Email.ParseEmail ( Network/HackMail/Email/ParseEmail.hs, interpreted )
[2 of 3] Compiling Network.HackMail.Email.Email ( Network/HackMail/Email/Email.hs, interpreted )
[3 of 3] Compiling Network.HackMail.Filter.Filter ( Network/HackMail/Filter/Filter.hs, interpreted )
*** Exception: No match in record selector Var.tcTyVarDetails

Fixed Code:

type Context = ReaderT Email
type Match t = StateT t IO
type ContextMatch t a = Context (Match t) a

-- changed `Bool` to `t`.
newtype FilterState t => Filter t a = Filter (ContextMatch t a)
      deriving (Functor, Monad, MonadReader Email, MonadState t, MonadIO)

class FilterState t where
       data FState t
       deliver :: FState t -> IO ()

System Info:

[jfredett@Erdos]$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.10.4
[jfredett@Erdos]$ uname -a
Linux Erdos 2.6.31-ARCH #1 SMP PREEMPT Fri Oct 23 11:12:58 CEST 2009 i686 Intel(R) Celeron(R) CPU 3.06GHz GenuineIntel GNU/Linux

(Possibly) Related Tickets include: 3621, 3422 and 2714

Trac metadata
Trac field Value
Version 6.10.4
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information