From: Dawid Toton <d0@wp.pl>
To: rossberg@mpi-sws.org, caml-list <caml-list@yquem.inria.fr>
Subject: Re: [Caml-list] Re: References and polymorphism
Date: Thu, 12 Jan 2012 10:55:02 +0100 [thread overview]
Message-ID: <4F0EADF6.10309@wp.pl> (raw)
In-Reply-To: <869af1b432cfe71214ce68625a92a1c0.squirrel@mail.mpi-sws.org>
On 2012-01-11 16:42, rossberg@mpi-sws.org wrote:
> Dawid Toton wrote:
>> On 2012-01-11 14:15, rossberg@mpi-sws.org wrote:
>>>> let f3 : forall ÂÂ'a . unit -> 'a list ref =
>>>> fun (type 'aa) ->
>>>> let r = ref ([] : 'aa list) in
>>>> fun () ->
>>>> r
>>>>
>>>> (* f3: Fine, but it would require some work at compile time or smart
>>>> transformations to keep types erased at run-time. Also, keeping the
>>>> first actual argument (staying for 'aa) implicit would need extra rules
>>>> to resolve ambiguities (decide when this argument is applied). *)
>>> No, this would be unsound, because "fun (type t) -> ..." does not the
>>> suspend computation -- there'd be only one ref. It's not System F.
>> c) computation is not suspended in the sense that the allocation is done
>> at compile time, but the implementation tries to keep only one ref cell
>> for this purpose. This is impossible. The function can't be compiled
>> this way.
> It is actually:
>
> d) computation is not suspended, allocation is done when the declaration is
> evaluated, for some.
>> The c) option is incorrect, as I understand it, regardless what type
>> system flavour is chosen.
> Not sure why you think so, but in any case, that's essentially what's
> happening. Type abstraction or application is not operationally observable
> in OCaml, or any similar language. Which is exactly the reason why the
> whole soundness issue with polymorphism + references arises, and you have to
> disallow certain combinations.
This specific example, the f3 function, won't happen in OCaml-like
language at all, because of the forall quantifier in type annotation for
the function. While I get the point that this generalization is
forbidden by the value restriction, what I'm trying to say is that the
value restriction is not needed here and I can't think of any convincing
example in favour of if.
Here is how we get the right result without the value restriction rule:
first the compiler has to choose the strategy (a), (b) or (c/d). For (a)
and (b) it can say that it isn't smart enough and refuse to compile the
code. On the other hand, the (c/d) case is rejected, because of the
impossible allocation of r: types int list ref and string list ref are
incompatible, hence one allocation for all the cases is insufficient.
This is so simple, because we are not interested in generalized ref
cells, I mean, values of forall 'a.('a list ref) types are useless and I
think that less sophisticated typechecker shouldn't even consider this type.
It is perhaps more clear if said this way: the strategy (c/d) is
equivalent to starting with the f0/f2 function body in order to build
something equivalent to f3. But f2 cannot be cast to f3, because (r :
∀'c. 'c list) allocated in f2 cannot be cast to 'aa list ref. An error
message would say that types 'c and 'aa cannot be unified, or - if the
quantifier for the function type is yet to be chosen - typechecker would
give up with forall and continue with a type variable (a type exists).
In case of ordinary OCaml, things are even simpler. One can't express
f3. My current understanding is that only f4 and the following are possible:
∃'b.
let f : X 'a. (unit -> 'a list ref) =
let r = ref ([] : 'b list) in
fun (type 'aa) ->
fun () ->
r
Only existential quantifier will fit X so the whole thing is well typed.
Again, no value restriction intervenes.
Dawid
next prev parent reply other threads:[~2012-01-12 9:55 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-10 15:29 [Caml-list] " Dario Teixeira
2012-01-10 15:45 ` Romain Bardou
2012-01-10 16:31 ` Arnaud Spiwack
2012-01-10 17:00 ` Dario Teixeira
2012-01-10 17:20 ` David Allsopp
2012-01-10 18:59 ` Gabriel Scherer
2012-01-11 10:48 ` [Caml-list] " Dawid Toton
2012-01-11 11:07 ` Gabriel Scherer
2012-01-11 13:00 ` Dawid Toton
2012-01-11 13:15 ` rossberg
2012-01-11 13:56 ` Dawid Toton
2012-01-11 15:42 ` rossberg
2012-01-12 9:55 ` Dawid Toton [this message]
2012-01-12 10:05 ` Andrej Bauer
2012-01-12 10:46 ` Romain Bardou
2012-01-11 11:43 ` rossberg
2012-01-11 13:34 ` Dawid Toton
2012-01-11 15:34 ` rossberg
2012-01-11 13:57 ` Dawid Toton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F0EADF6.10309@wp.pl \
--to=d0@wp.pl \
--cc=caml-list@yquem.inria.fr \
--cc=rossberg@mpi-sws.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox