
Christopher Done wrote:
On 4 October 2013 10:56, Heinrich Apfelmus
wrote: In particular, the Locker stores arbitrary values like Dynamic , except that values are extracted and removed with the help of a Key . This gets rid of the Typeable constraint.
lock :: Key a -> a -> Locker
I can't pass anything with class constraints to that.
I don't know what "something with a class constraint" means. But I guess you want to pass a value with a *polymorphic* type? This is no problem, but requires impredicative polymorphism: a = (forall b. Show b => b -> IO ()) lock :: Key (forall b. Show b => b -> IO ()) -> (forall b. Show b => b -> IO ()) -> Locker Unfortunately, GHC's support for that is a little shaky, but a solution that always works is to put it in a new data type. data Dummy = Dummy { unDummy :: forall b. Show b => b -> IO () } lock :: Key Dummy -> Dummy -> Locker It seems to me that your problem decomposes into two problems: 1. A heterogenous store for values of different types. 2. Values with polymorphic instead of monomorphic types. Solution for problem 1 are usually restricted to monomorphic types, but you can work around it. Best regards, Heinrich Apfelmus -- http://apfelmus.nfshost.com