data S = S { i::Int, d::Double }
data Foo = A Int | B Double | C S

foo = A 3;
bar = B 3.5
baz = C S{ i = 7, d = 7.5 }

prtfoo val =
  -- pattern match on constructor
  case val of
    A a -> print a
    B b -> print b
    C (S i d) -> do
        print i
        print d

data Bar = X Int | Y Int | Z Int;
prtbar val =
  -- pattern match on constructor
  case val of
    X x -> print x
    Y y -> print y
    Z z -> print z

foo2 = X 3;
bar2 = Y 4;
baz2 = Z 5;

main = do
  prtfoo foo
  prtfoo bar
  prtfoo baz
  prtbar foo2
  prtbar bar2
  prtbar baz2

-- Local Variables: --
-- compile-command: "ghc test.hs; ./test" --
-- End: --
