caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] inference and phantom types
@ 2002-10-21 15:23 Julien Cohen
  2002-10-22  1:59 ` Jacques Garrigue
  0 siblings, 1 reply; 2+ messages in thread
From: Julien Cohen @ 2002-10-21 15:23 UTC (permalink / raw)
  To: caml-list

I read in the thread 
http://caml.inria.fr/archives/200109/msg00097.html
that phantom types could be used in ocaml but I have some 
troubles understanding the way they really work.

In the following session I use a phantom type ('a,'b)t to 
simulate a list with an additionnal type 'b. I create a special 
cons preserving the type. I create an (int,bool)t value and when 
I make a cons on it and the phantom type seems not to be well 
infered:



         Objective Caml version 3.04

# type ('a,'b) t = 'a list;;
type ('a, 'b) t = 'a list

# let f (x:'a) (y:('a,'b) t) = (x::y : ('a,'b) t);;
val f : 'a -> ('a, 'b) t -> ('a, 'b) t = <fun>

# let (v: (int,bool) t) = [1];;
val v : (int, bool) t = [1]

# f 1 v;;
- : (int, '_a) t = [1; 1]


Is there a fundamental reason for the bool type not to be inferred?
(no response in the ocaml-beginner list)

Thanks
Julien Cohen

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Caml-list] inference and phantom types
  2002-10-21 15:23 [Caml-list] inference and phantom types Julien Cohen
@ 2002-10-22  1:59 ` Jacques Garrigue
  0 siblings, 0 replies; 2+ messages in thread
From: Jacques Garrigue @ 2002-10-22  1:59 UTC (permalink / raw)
  To: jcohen; +Cc: caml-list

From: Julien Cohen <jcohen@lami.univ-evry.fr>

> I read in the thread 
> http://caml.inria.fr/archives/200109/msg00097.html
> that phantom types could be used in ocaml but I have some 
> troubles understanding the way they really work.
> 
> In the following session I use a phantom type ('a,'b)t to 
> simulate a list with an additionnal type 'b. I create a special 
> cons preserving the type. I create an (int,bool)t value and when 
> I make a cons on it and the phantom type seems not to be well 
> infered:
> 
> 
> 
>          Objective Caml version 3.04
> 
> # type ('a,'b) t = 'a list;;
> type ('a, 'b) t = 'a list
> 
> # let f (x:'a) (y:('a,'b) t) = (x::y : ('a,'b) t);;
> val f : 'a -> ('a, 'b) t -> ('a, 'b) t = <fun>
> 
> # let (v: (int,bool) t) = [1];;
> val v : (int, bool) t = [1]
> 
> # f 1 v;;
> - : (int, '_a) t = [1; 1]
> 
> 
> Is there a fundamental reason for the bool type not to be inferred?
> (no response in the ocaml-beginner list)

Not surprising, this is not a beginner question :-)

What happens is just that abbreviation types are expanded before
unification, meaning that you are actually not unifying
('a,'b) t with ('c,'d) t, but only 'a list with 'c list, so that 'b
and 'd will not be unified.

Note that in recent versions of ocaml, defining a datatype (with
constructors) will not help: the typecker infers variance, and will
detect that 'b is unused in the definition, so that again it will just
be discarded during unification (or subtyping).

The real solution is to use an abstract type:
put your type definition in a module with necessary operations,
and provide an interface where the type is abstract.

For instance

module M : sig
  type (+'a,'b) t
  val inj : 'a list -> ('a,'b) t
  val proj : ('a,'b) t -> 'a list
end = struct
  type ('a,'b) t = 'a list
  let inj x = x
  let proj x = x
end

If you really don't want your type to be abstract, you will need to
make the type variable appear somewhere in it with the right variance,
which can be complicated...

Jacques Garrigue
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2002-10-22  2:13 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-21 15:23 [Caml-list] inference and phantom types Julien Cohen
2002-10-22  1:59 ` Jacques Garrigue

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).