Is there any abstract container  that permits the addition of  new types of data? I know how to simulate the extension of Algebraic datatypes, but this does not permit the addition of data with new types in the same container and recover them in a  type-safe way.

Did I reinvent the Weel? I found something, that permits this for any Typeable datatype. For example


 x=5
 list= [put x,  put "hello"]

 [t1,t2 ]= list

 x' = get t1 :: Int
 s = get t2 :: String
 print (x' +1)     -- 2  
 print s            -- "hello"
 
 x''= get t2 :: Int            --"get: casting from String  to type Int"



The code:

data Abstract= forall a. Typeable a => T !String  a

 
class FromToAbstract x where
 put :: x -> Abstract
 get ::  Abstract -> x
 unsafeGet :: Abstract -> x
 
 -- get(put x)== x

instance Typeable x => FromToAbstract x where
 put x= T (typeString x) x
      
 get (Abstract type1 a)= if type2 == type1 then v
                        else error ("get: casting "++ "from type "++type1++" to type "++type2)
           where
           v=  unsafeCoerce a :: x
           type2= typeString v

 unsafeGet (Abstract type1 a)= unsafeCoerce a


typeString !x= tyConString $ typeRepTyCon $ typeOf x

instance Typeable T where
  typeOf _= mkTyConApp (mkTyCon "Abstract") []