[Re-adding caml-list: I thought this conversation about let-polymorphism might be of wider interest.] The "stability" property you mention is nice, but of course if you don't have let-polymorphism then you get a different handy rewrite, namely the equivalence of let x = e1 in e2 and (fun x -> e2) e1 no? I was surprised when I first realized this didn't hold in ML. In your last paragraph, you seem to elide the distinction between monomorphic and polymorphic let, implying that both are the bottom rung of the type hierarchy...but I'm proposing that polymorphic let is already an extension of a simpler system. Does polymorphic let not seem "richer" than lambda to you? It certainly seems to me to affect the metatheory (although recently I've been thinking more about set-theoretic sematics than the usual type-theoretic properties). Maybe I'm splitting hairs...overall it still seems reasonable to me to exclude let-polymorphism from Llama Light, considering that the goal is be a minimal base system, and this one appears to be perfectly practical. I can't tell whether you disagree with this. -Jeremy On Mon, Aug 30, 2010 at 4:06 PM, bluestorm wrote: > On Mon, Aug 30, 2010 at 7:03 PM, Jeremy Bem wrote: > > Right...thanks for the refresher. I suppose I should implement this, as > > technically it is not "ML" until I do. I'm still wondering why this is > > considered an essential and desirable feature. > > One reason it is interesting is that it gives you the following > stability property, > wich is good for refactoring (both by humans and by copmuters) for example > : > > let x = e1 in e2 is equivalent to e2{x <- e1} (e2 in wich > all free occurences of x are replaced by e1) > > If let isn't polymorphic, then for example let id x = x in (id 1, id > 2) doesn't work out. > > There are other cases where polymorphism may be useful locally. For > example in Haskell, the ST monad use polymorphism to encode an > information about the use of effects in your code : if all effect are > used locally (so the function is "observationally pure", or > "referentially transparent", while still using side effects inside), > the result will be polymorphic in the state parameter of the ST monad. > If it's not, we know a side effect has escaped, and the type system > forbids you from "running" the monad. > > > > If one can make local polymorphic definitions, why > > not local types and local exceptions? > > In OCaml you can have local types and exceptions through the "let > module = .. in .." construct. > > Note however that, on a "richness of the type system" scale, they're > much higher in the hierarchy. Binders on value (lambda and let) are > features of the simple lambda-calculus. Binding on types is a much > more advanced feature, as it belongs to System F. Binders on module > and functors (let module = ... in ..) is even richer, as it translates > in system Fomega. It may not make a lot of difference to the > programmer, but the metatheory needed to support each of these > extension is quite different. Let-binding is the simpler of those. >