{-# LANGUAGE DataKinds, TypeOperators #-} import Data.Type.Set foo :: Set '["x" :-> Int, "z" :-> Int, "w" :-> Int] foo = Ext ((Var :: (Var "x")) :-> 2) $ Ext ((Var :: (Var "z")) :-> 4) $ Ext ((Var :: (Var "w")) :-> 5) $ Empty bar :: Set '["y" :-> Int, "w" :-> Int] bar = Ext ((Var :: (Var "y")) :-> 3) $ Ext ((Var :: (Var "w")) :-> 1) $ Empty -- GHC can easily infer this type, so an explicit signature not necessary -- foobar :: Set '["w" :-> Int, "x" :-> Int, "y" :-> Integer, "z" :-> Int] foobar = foo `union` bar