Having Nil not need a type parameter is absolutely not necessary for immutability. It just makes code involving Nil a tad more readable. Also cons lists are not our only option in immutable code, just as the mutable world is richer than just having ArrayList everywhere. On Oct 15, 2012 8:37 AM, "Kevin Wright" <kev.lee.wri...@gmail.com> wrote:
> > > On 15 October 2012 12:01, Reinier Zwitserloot <reini...@gmail.com> 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 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. > -- You received this message because you are subscribed to the Google Groups "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.