Andreas Rossberg wrote: > > ~/> ocaml -rectypes > Objective Caml version 3.08.3 > > # let rec blackhole x = blackhole;; > val blackhole : 'b -> 'a as 'a = <fun> > > The problem is, though, that almost everything can be typed once you > have unrestricted recursive types (e.g. missing arguments etc), and > consequently many actual errors remain unflagged (which clearly shows > that typing is not only about potential value class mismatches). > Moreover, there are very few practical uses of such a feature, and they > can always be coded easily with recursive datatypes. > > It is a pragmatic decision born from experience that you simply do *not > want* to have this, even though you easily could. E.g. for OCaml, > unrestricted recursive typing was removed as default because of frequent > user complaints. > > Which is why this actually is a very bad example to chose for dynamic > typing advocacy... ;-)
Actually, this seems a *good* example. The problem seems to be that you end up throwing the baby out with the bathwater: your static type system stops catching the errors you want once you make it powerful enough to express certain programs. So now it seems to come down to a matter of taste: use a restricted language and catch certain errors early or use an unrestricted language and miss certain errors. It is interesting that the PLT people have made this tradeoff as well. In the DrScheme system, there are different `language levels' that provide a restricted subset of Scheme. At the beginner level, first-class procedures are not allowed. This is obviously restrictive, but it has the advantage that extraneous parenthesis (a common beginner mistake) cannot be misinterpreted as the intent to invoke a first-class procedure. -- http://mail.python.org/mailman/listinfo/python-list