Re: Why is this not allowed?
 Pierre Weis
[
Home
]
[ Index:
by date

by threads
]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
Date:   (:) 
From:  Pierre Weis <Pierre.Weis@i...> 
Subject:  Re: Why is this not allowed? 
> Damien Doligez <Damien.Doligez@inria.fr> writes: > > > ># let rec id'' = id;; > > >This kind of expression is not allowed as righthand side of `let rec' > > > > Because we don't know how to compile "let rec x = x" or > > let rec x = y > > and y = x > > > > Moreover, you can just remove the "rec" and it works. It is possible > > to implement "let rec var1 = var2", but the usefulness is quite small > > compared to the amount of code we would need to write. > > Well, you can't quite. Because of the value restriction, id'' defined > like this: > > let id'' = id;; > > has type: > > id'' : '_a > '_a > > (That is, it'll only work for a single type.) > > John. There is some confusion here: since «id» is an expression that is a mere variable, it is not expansive; hence it can be safely generalized; hence it can be used with different uncompatible types: # let id x = x;; val id : 'a > 'a = <fun> # let id'' = id;; val id'' : 'a > 'a = <fun> # id'' 1, id'' true;;  : int * bool = 1, true Rule of thumb concerning the polymorphism generalisation restriction: the restriction is performed by matching the right hand side expression e of a let definition: 1 if e is a constant, a variable expression, a function (that is a syntactically explicit function, introduced by the keyword fun or function), or a constructor application, then its type can safely be generalised. 2 otherwise the type of e is not generalized. Condition 1 is a rough approximation of the property ``the execution of e cannot create a polymorphic mutable value''; in practice, condition 2 means that if e is a function application then its type is not generalized. Best regards, Pierre Weis INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://cristal.inria.fr/~weis/