* A bug(?) around phantoms in 3.11.0 b1 (Re: [Caml-list] OCaml version 3.11.0+beta1) @ 2008-10-21 7:15 Jun Furuse 2008-10-21 8:32 ` A bug(?) around phantoms in 3.11.0 b1 Jacques Garrigue 0 siblings, 1 reply; 3+ messages in thread From: Jun Furuse @ 2008-10-21 7:15 UTC (permalink / raw) To: caml users Hi, I found a strange bug in 3.11.0 beta 1. The following typical example of phantom types does not compile any more. (It is compilable in 3.10.2, but not in release311): module M : sig type +'a t constraint 'a = [< `checked | `unchecked ] val check : _ t -> [ `checked ] t end = struct type +'a t = { x : int } constraint 'a = [< `checked | `unchecked ] let check (t : _ t) = t (* actually it grants anything *) end A strange thing is that if I change the definition as follows it compiles! module M : sig type +'a t constraint 'a = [< `checked | `unchecked ] val check : _ t -> [ `checked ] t end = struct type u = { x : int } (* strange workaround *) type +'a t = u constraint 'a = [< `checked | `unchecked ] let check (t : _ t) = t (* actually it grants anything *) end = j ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: A bug(?) around phantoms in 3.11.0 b1 2008-10-21 7:15 A bug(?) around phantoms in 3.11.0 b1 (Re: [Caml-list] OCaml version 3.11.0+beta1) Jun Furuse @ 2008-10-21 8:32 ` Jacques Garrigue 2008-10-21 9:21 ` Jun Furuse 0 siblings, 1 reply; 3+ messages in thread From: Jacques Garrigue @ 2008-10-21 8:32 UTC (permalink / raw) To: jun.furuse; +Cc: caml-list Hi Jun, If it's a bug, it should go to mantis... but it's not one. From: "Jun Furuse" <jun.furuse@gmail.com> > I found a strange bug in 3.11.0 beta 1. The following typical example > of phantom types does not compile any more. (It is compilable in > 3.10.2, but not in release311): > > module M : sig > type +'a t constraint 'a = [< `checked | `unchecked ] > val check : _ t -> [ `checked ] t > end = struct > type +'a t = { x : int } constraint 'a = [< `checked | `unchecked ] > let check (t : _ t) = t (* actually it grants anything *) > end Actually, it doesn't compile in 3.10.2. (At least, not in release310) But it did compile until 3.10.0, and this was a bug. Indeed, in the above 'a is a constrained variable, so its variance is not inferred. The explicit variance is +'a, which doesn't cancel unification. (One might argue that we need a special variance to indicate types that do not appear in the body...) > A strange thing is that if I change the definition as follows it compiles! > > module M : sig > type +'a t constraint 'a = [< `checked | `unchecked ] > val check : _ t -> [ `checked ] t > end = struct > type u = { x : int } (* strange workaround *) > type +'a t = u constraint 'a = [< `checked | `unchecked ] > let check (t : _ t) = t (* actually it grants anything *) > end This is not strange. Here 'a t expand to u, where 'a is forgotten. So the type annotation really removes the connection between input and output types. This is the right way to obtain what you wish. Jacques ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: A bug(?) around phantoms in 3.11.0 b1 2008-10-21 8:32 ` A bug(?) around phantoms in 3.11.0 b1 Jacques Garrigue @ 2008-10-21 9:21 ` Jun Furuse 0 siblings, 0 replies; 3+ messages in thread From: Jun Furuse @ 2008-10-21 9:21 UTC (permalink / raw) To: Jacques Garrigue; +Cc: caml-list Hi Jacques, Thanks for your insightful answer. I misunderstood it was a new problem to 311, since here we use a slightly older version (3.10dev0) for our work, which compiles the code. = j On Tue, Oct 21, 2008 at 5:32 PM, Jacques Garrigue <garrigue@math.nagoya-u.ac.jp> wrote: > Hi Jun, > > If it's a bug, it should go to mantis... but it's not one. > > From: "Jun Furuse" <jun.furuse@gmail.com> >> I found a strange bug in 3.11.0 beta 1. The following typical example >> of phantom types does not compile any more. (It is compilable in >> 3.10.2, but not in release311): >> >> module M : sig >> type +'a t constraint 'a = [< `checked | `unchecked ] >> val check : _ t -> [ `checked ] t >> end = struct >> type +'a t = { x : int } constraint 'a = [< `checked | `unchecked ] >> let check (t : _ t) = t (* actually it grants anything *) >> end > > Actually, it doesn't compile in 3.10.2. > (At least, not in release310) > But it did compile until 3.10.0, and this was a bug. > Indeed, in the above 'a is a constrained variable, so its variance is > not inferred. The explicit variance is +'a, which doesn't cancel > unification. > (One might argue that we need a special variance to indicate types > that do not appear in the body...) > >> A strange thing is that if I change the definition as follows it compiles! >> >> module M : sig >> type +'a t constraint 'a = [< `checked | `unchecked ] >> val check : _ t -> [ `checked ] t >> end = struct >> type u = { x : int } (* strange workaround *) >> type +'a t = u constraint 'a = [< `checked | `unchecked ] >> let check (t : _ t) = t (* actually it grants anything *) >> end > > This is not strange. Here 'a t expand to u, where 'a is forgotten. > So the type annotation really removes the connection between input and > output types. > This is the right way to obtain what you wish. > > Jacques > ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-10-21 9:21 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2008-10-21 7:15 A bug(?) around phantoms in 3.11.0 b1 (Re: [Caml-list] OCaml version 3.11.0+beta1) Jun Furuse 2008-10-21 8:32 ` A bug(?) around phantoms in 3.11.0 b1 Jacques Garrigue 2008-10-21 9:21 ` Jun Furuse
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox