
On Friday 05 November 2004 15:51, you wrote:
On Fri, Nov 05, 2004 at 01:57:53PM +0100, Benjamin Franksen wrote:
Hello Experts,
I need MVar and Chan to be instances of Typeable. Any hint on how this is most easily done would be greatly appreciated. I could change the libraries and add 'deriving Typeable' but I hesitate to do so.
The easiest way is to hide type constructor Chan:
import Control.Concurrent import Data.Generics
newtype MyChan a = MyChan (Chan a) deriving Typeable
Of course, you can also write the instance for Chan by hand.
This might be the easiest way, but is otherwise inconvenient. I tried to write the instances by hand. My first attempt was: instance Typeable a => Typeable (MVar a) where typeOf x = mkAppTy (mkTyCon "Control.Concurrent.MVar.MVar") [typeOf (undefined::a)] but unfortunately this doesn't work. Ghc complains about Ambiguous type variable `a1' in the top-level constraint: `Typeable a1' arising from use of `typeOf' at Helpers.hs:8 The reason is apparently that inside the definition of typeOf the type variable 'a' is not unified with the 'a' from the instance header. I could write typeOf (MVar x) = mkAppTy (mkTyCon "Control.Concurrent.MVar.MVar") [typeOf y] where y = undefined `asTypeOf` x but the doc says that typeOf should be written without evaluating its argument, so that is ca be passed 'undefined'. What I need is a trick that enables me to get at the type of the 'a' in the instance header for use inside definition of 'typeOf'. Ben