Type-safe open unions in Haskell