On Tue, Aug 18, 2009 at 3:13 AM, Peter Becker <peter.becker...@gmail.com>wrote:
> > What I would really like to see is a meet/or/disjunction/union operator > in the type system, with a case-like construct to resolve the resulting > types. Scala has two things that are halfway there (Either, case > classes), but neither is the full monty. > Few type systems have true union types. The algebraic data types of the ML and Haskell families, for instance, do not allow unioning of types without explicitly creating a new type with its own "constructors". See Either which in Haskell looks like. data Either a b = Left a | Right b In Scala, Haskell, or SML Either is really just a way of faking union typing in a type system that doesn't do union typing. Java is actually very unusual in that the small bit of its type system devoted to exceptions basically has union types. If a method says it throws A,B,C then the union "A,B,C" forms a type and the type "A,B" is a subtype, the type "A,B,C,D" is a supertype. With regards to declared exceptions on methods Java is covariant. I know that's not how checked exceptions are normally presented, but that's how the type rules work. But then Java, as usual, isn't very regular about this union typing business. You can write Integer myFunction(File file) throws IOException, MyBusinessException {...} But if you try to make it "first class" with something like interface Function<In, Out, Exc> { Out apply(In in) throws Exc; } You can't then write something like new Function<File, Integer, {IOException, MyBusinessException}> {...} Your first class function has to pick one exception or declare that it throws a common supertype. Project Coin proposed the ability to catch mutliple exception types with one catch block. That can be seen as extending union typing just a touch further, but it still doesn't cover exception types as type parameters. It's not surprising to me at all that Java remains virtually the only language with checked exceptions. They might be a fine idea, but making them usable and consistent across the language is very tough business. Checked exceptions are what's called an effects system, which is a way to extend a type system so that functions describe effects they might have beyond computing a value. Creating an effects system that is usable and consistent across the language is very much ongoing research. See Disciple http://www.haskell.org/haskellwiki/DDC/EffectSystem, but I warn you it's not for the faint of heart. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "The Java Posse" group. To post to this group, send email to javaposse@googlegroups.com To unsubscribe from this group, send email to javaposse+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/javaposse?hl=en -~----------~----~----~----~------~----~------~--~---