[Haskell-cafe] Of types and constructors; a question of programming style

Alastair Reid alastair at reid-consulting-uk.ltd.uk
Thu Jul 8 05:35:22 EDT 2004


It sounds a little as though you want a family of n-ary union type 
constructor.  A crude first attempt would be:

  data Either2 t1 t2 = In1 t1 | In2 t2
  data Either3 t1 t2 t3 = In1 t1 | In2 t2 | In3 t3
  ...

but this would be a bit tedious to use because the names are a bit meaningless 
- you'd be relying heavily on type checking to keep you straight.  e.g., it's 
kinds hard to read:

  f :: Either String Bool -> Either String Bool 
  f (In1 "Fred") = In1 "Frederick"
  f (In2 m)      = In2 (not m)

Proposals for records gives you an easy way to define arbitrary product types 
with convenient syntax:

  { name = "Fred", married = True } :: { name :: String, married :: Bool }

Maybe what you really want here is a way to define union types with some 
convenient syntax.  In the following made up syntax, |[ ... |] contains a 
list of types to be unioned together with each type labelled by a constructor 
name.

  f :: |[ Name :: String, Married :: Bool |] 
    -> |[ Name :: String, Married :: Bool |]
  f |[ Name = "Fred" |] = |[ Name = "Frederick |] 
  f [| Married = m |]   = [| Married = not m |]

I wonder if an extension like this would be generally useful?  (Would it be 
useful for defining a compiler/interpreter by first giving a simple language 
and then adding further operations?)

--
Alastair Reid


More information about the Haskell-Cafe mailing list