Two words:
ivory tower
Retrofitting concepts into languages where there's little *real* benefit
serves only to waste resources that could be better spent elsewhere --
and to risk breaking things, e.g. backward compatibility, that do have
real, tangible benefit.
We're in the real world, developing real software. Nothing is perfect
and no one has the luxury to repeatedly up-end everything to rework
everything that wasn't 100% perfect. Sure, when there are serious
issues you go back and rework things, but there are time/resource vs.
compability/migration-cost vs. perfection vs. .... tradeoffs that one
must carefully weigh. That's one reason it's called software engineering.
On 10/15/2012 6:37 AM, Kevin Wright wrote:
On 15 October 2012 12:01, Reinier Zwitserloot <[email protected]
<mailto:[email protected]>> wrote:
On Monday, October 8, 2012 1:33:06 AM UTC+2, Simon Ochsenreither
wrote:
I think it is an interesting example how some "pragmatic" and
superficially simpler approach tends to break down and cause
complexity in both the spec and the implementation compared to
the "academic" solution.
Yes, java has no type that represents "there is no value that is
this type, not even 'null'". It would be cool if this type
existed; a method that had this as return type cannot actually
return, ever. It has to exit abnormally: Either it runs
System.exit(0), which should probably at that point return this
special Nothing type (so that you can type: return
System.exit(0)), or it has to throw an exception. There are no
other ways out.
There are other cases too, it also crops up in recursion where there's
absolutely no information whatsoever available for type inference.
Just consider:
def method[A](x: A): A = method(x)
Something like this, without tail recursion, would ultimately crash
the JVM with a StackOverflowException.
More importantly though... even given a variant that did terminate and
didn't stack overflow, what type could reasonably be inferred *except*
for Nothing?
Unfortunately, introducing this kind of concept is exactly the
kind of thing java does NOT do, and languages like Scala DO do:
it's not a matter of superiority, it's a matter of tradeoffs: If
this Nothing exists, it cannot actually be a subtype of Object; a
List<?> cannot accept an instance of List<Nothing>, because I can
still put nulls in List<?>, and nulls are not a valid value for
Nothing. Hell, generics in general play havoc with this: Using
trickery I can make a List<Nothing> with nulls in it, and then
write return thisHackedList.get(0), which means in practice that
Nothing needs type checking (i.e. that would lead to a
ClassCastException or similar, even if .get(0) returns null).
Fortunately, this is *exactly* you you want to do with an immutable list!
The only way to add an element to an immutable list is to create a new
list containing the old one as a subset. This means that the type of
every element in the existing list must subclass the element type of
the new list.
To put it another way, this means that the element being added to an
immutable list must be a superclass of the element type of all
elements already in the list.
And, because such lists are immutable, they must be built up by
starting with an empty list. This empty list must have an element
type such that *anything* you might add to it is a superclass.
The element type of such an empty list MUST be the subtype of every
other type in existence.
That type is Nothing, and Scala's empty list (called Nil) is, indeed,
an instance of List[Nothing]
List[Nothing] not only makes sense, it's actually a necessary
requirement to get immutability right. It also only works if Nothing
is very much a subclass of Object, and Null, and anything else you
care to mention.
That's the kind of thing where java has decided that the practical
upside of having a 'Nothing' value is not actually that much; it's
largely academic, and it definitely "feels bad" that the language
is not complete, and that this awesome concept is not actually in
your language. However, adding it to the language definitely
incurs a cost: The compiler needs to do all sorts of things to
treat Nothing specially, and this is going to make the spec much
more complicated.
What of the cognitive cost to having this concept that developers must
necessarily encounter, then forcing them to use hacks and workarounds
because it cannot be represented in their programming language?
Scala-like design says you accept the complexity hit, and
theorizes that if you go whole-hog on this you can actually remove
a lot of complexity because the language is much more flexible. So
far that seems like it's been working out reasonably well for
scala. The java-like design says that these mostly academic
features just aren't important enough, and in practice the
language will be simpler if you just don't have them. Where people
need them, they'll kludge it.
Isn't that what they tried with Date? and then Calendar?
Sounds ugly. Yet, java's popularity and the robustness of
java-based apps like google ads and many a server out there
suggest it's fine.
It's a testament to what a decent developer is able to work around,
but the ecosystem developed on the back of Java's strengths and in
spite of its flaws - not *because* of its flaws!
(Some newer languages got all of this right from the start.)
Right. I'm saying, well, the jury is still out on this. Is it
actually right to burden your language with the Nothing concept?
I'm pretty sure that retrofitting Nothing onto java is a grave
mistake at this point.
I fear that the bigger mistake is to add lambdas, and immutable
structures, and the whole
the-free-lunch-is-over-my-GPU-has-1000-cores-we-desperately-need-to-get-concurrency-right
infrastructure, then to cripple it by missing something so fundamental
from the type system!
--
You received this message because you are subscribed to the Google
Groups "Java Posse" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/javaposse?hl=en.
--
You received this message because you are subscribed to the Google Groups "Java
Posse" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/javaposse?hl=en.