<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE message PUBLIC
  "-//MLarc//DTD MLarc output files//EN"
  "../../mlarc.dtd"[
  <!ATTLIST message
    listname CDATA #REQUIRED
    title CDATA #REQUIRED
  >
]>

  <?xml-stylesheet href="../../mlarc.xsl" type="text/xsl"?>


<message 
  url="2009/01/eed2238e7a54f55ec6c038598c55045b"
  from="Julien SIGNOLES &lt;julien.signoles@c...&gt;"
  author="Julien SIGNOLES"
  date="2009-01-14T15:31:18"
  subject="Caml implementation of the relaxed value restriction"
  prev="2009/01/eaa7a5e430cc498ebaa24cfa72dfa40c"
  next="2009/01/a1ade591c77a79c5499179f8e61baf52"
  next-in-thread="2009/01/bd2154c070fbbf0db327cfe1ac2f06b8"
  prev-thread="2009/01/6cf79b75301fab6a2690970d5f9afce6"
  next-thread="2009/01/05bc548e588fe9c3a7b00f01c10770eb"
  root="../../"
  period="month"
  listname="caml-list"
  title="Archives of the Caml mailing list">

<thread subject="Caml implementation of the relaxed value restriction">
<msg 
  url="2009/01/eed2238e7a54f55ec6c038598c55045b"
  from="Julien SIGNOLES &lt;julien.signoles@c...&gt;"
  author="Julien SIGNOLES"
  date="2009-01-14T15:31:18"
  subject="Caml implementation of the relaxed value restriction">
<msg 
  url="2009/01/bd2154c070fbbf0db327cfe1ac2f06b8"
  from="Mark Shinwell &lt;mshinwell@j...&gt;"
  author="Mark Shinwell"
  date="2009-01-14T15:52:55"
  subject="Re: [Caml-list] Caml implementation of the relaxed value restriction">
</msg>
</msg>
</thread>

<contents>
Hello,

In the article "Many Holes in Hindley-Milner" [1], Sam Lindley claims
that the type of x is ('a * 'a s, int) NList.t in the following ocaml
program because of Garrigue's relaxed value restriction [2].
==========
type 'a s

module NList : sig
  type (+'length, +'elem_type) t
  val nil : ('m*'m, 'a) t
  val cons: 'a * ('m*'n, 'a) t -&gt; ('m*'n s,'a) t
end = struct
  type ('i,'a) t = 'a list
  let nil = []
  let cons (x, l) = x :: l
end

let x = NList.cons (1, NList.nil)
==========

But, both with ocaml v3.10.2 and ocaml v3.12.0+dev1 (2008-12-03) (that
is the current cvs version), the infered type of [x] only contains a
weak type variable: ('_a * '_a s, int) NList.t.

I quickly look at the typing rules introduced by Jacques Garrigue in [2]
and it seems to me that Sam Lindley is right: [x] is generalisable in
the above program.

So, what's wrong here?

[1] Many Holes in Hindley-Milner.
    Sam Lindley. In ACM Sigplan Workshop of ML 2008, Victoria, British
    Columbia, Canada, September 2008.
[2] Relaxing the value restriction.
        Jacques Garrigue. In International Symposium on Functional and
        Logic Programming, Nara, April 2004. Springer-Verlag LNCS 2998.

Best regards,
Julien Signoles
-- 
Researcher-engineer
CEA LIST, Software Reliability Lab
91191 Gif-Sur-Yvette Cedex
tel:(+33)1.69.08.71.83  fax:(+33)1.69.08.83.95  Julien.Signoles@cea.fr

</contents>

</message>

