example student (product, sum, recursive) sum type haskell sealed traits product type tuple case class recursive type