module Simple where import Control.Monad import Data.TypeRep import Data.TypeRep.Types.Basic import Data.TypeRep.Types.Basic.Typeable () -- A universe of three types type MyUniverse = IntType :+: FloatType :+: BoolType -- A list with dynamically typed elements hlist :: [Dynamic MyUniverse] hlist = [toDyn True, toDyn (1 :: Int)] -- Dynamically typed addition for any numeric type addDyn :: (TypeEq ts ts, PWitness Num ts ts) => Dynamic ts -> Dynamic ts -> Either String (Dynamic ts) addDyn (Dyn ta a) (Dyn tb b) = do Dict <- typeEqM ta tb Dict <- pwit pNum ta return (Dyn ta (a+b)) test2 = toDyn (1 :: Int) `addDyn` toDyn (2 :: Int) test3 = toDyn (3 :: Float) `addDyn` toDyn (4 :: Float) main = do unless t1 $ fail "Test 1 failed" unless t2 $ fail "Test 2 failed" unless t3 $ fail "Test 3 failed" putStrLn "All tests passed" where t1 = show hlist == "[True,1]" t2 = show (test2 :: Either String (Dynamic MyUniverse)) == "Right 3" t3 = show (test3 :: Either String (Dynamic MyUniverse)) == "Right 7.0"