{-# LANGUAGE GADTs #-} import Data.Coerce import Data.Ord (Down(..)) data OddPair b where OddPair :: forall a b . Coercible a b => a -> b -> OddPair b foo :: OddPair [Int] foo = let x = [1, 2, 3] in OddPair (Down x) x {-# NOINLINE foo #-} main :: IO () main = case foo of OddPair x y -> print (coerce x ++ y)