caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Jacques Garrigue <garrigue@kurims.kyoto-u.ac.jp>
To: David.Gurr@med.ge.com
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] a puzzling polymorphic variant type
Date: Thu, 08 May 2003 17:48:26 +0900	[thread overview]
Message-ID: <20030508174826L.garrigue@kurims.kyoto-u.ac.jp> (raw)
In-Reply-To: <D4DBD8568F05D511A1C20002A55C008C11AC04FD@uswaumsx03medge.med.ge.com>

Hi David,

The explanation of your problem is simple:
you've solved the input side, but you're still unifying everything on
the output side of your first scope_term.

A possible solution is to match again the output of scope_term_lst, to
avoid this spurious unification.

     let rec scope_term sc  = function
       | #lambda as t -> scope_term_lambda scope_term sc t
       | #lst as t    ->
           let #lst as r = scope_term_lst scope_term sc t
           in r

Cheers,

---------------------------------------------------------------------------
Jacques Garrigue      Kyoto University     garrigue at kurims.kyoto-u.ac.jp
		<A HREF=http://wwwfun.kurims.kyoto-u.ac.jp/~garrigue/>JG</A>

From: "Gurr, David (MED, self)" <David.Gurr@med.ge.com>
> I had quick hack I wanted to try with XL's modular module system.  I
> changed MiniML.ML.term to a polymorphic variant and thus changed the 
> definitions of MiniML.MLScoping.scope_term : MiniML.ML.term ->
> MiniML.ML.term
> as follows:
> 
> 
>     type 'term lst = [
>       | `Nil
>       | `Cons of 'term * 'term lst
>       ]
>     type 'term lambda = [
>       | `Constant of int                        (* integer constants *)
>       | `Longident of path                      (* id or mod.mod...id *)
>       | `Function of Ident.t * 'term             (* fun id -> expr *)
>       | `Apply of 'term * 'term                   (* expr(expr) *)
>       | `Let of Ident.t * 'term * 'term           (* let id = expr in
> expr *)
>       ]
>     type term = [
>       | term lambda
>       | term lst
>       ]
> 
>     let rec scope_term_lst scope_term sc = function 
>       | `Nil -> `Nil
>       | `Cons(h,t) -> `Cons(scope_term sc h,scope_term_lst scope_term sc
> t) 
> 
>     let rec scope_term_lambda scope_term sc = function
>       | `Constant n -> `Constant n
>       | `Longident path -> `Longident(Scope.value_path path sc)
>       | `Function(id, body) ->
>           `Function(id, scope_term (Scope.enter_value id sc) body)
>       | `Apply(t1, t2) -> `Apply(scope_term sc t1, scope_term sc t2)
>       | `Let(id, t1, t2) ->
>           `Let(id, scope_term sc t1, scope_term (Scope.enter_value id
> sc) t2)
> 
>      let rec scope_term sc  = function
>        | #lambda as t -> scope_term_lambda scope_term sc t
>        | #lst as t    -> scope_term_lst scope_term sc t
> 
> But I did not get the type I expected.  Instead I got:
> 
> val scope_term :
>  Scope.t ->
>  ([< `Apply of 'a * 'a
>    | `Cons of 'a * 'a lst
>    | `Constant of int
>    | `Function of Ident.t * 'a
>    | `Let of Ident.t * 'a * 'a
>    | `Longident of path
>    | `Nil] as 'a) ->
>  ([> `Apply of 'b * 'b
>    | `Cons of 'b * 'b    <<<<<<<<<<<<<<< what?
>    | `Constant of int
>    | `Function of Ident.t * 'b
>    | `Let of Ident.t * 'b * 'b
>    | `Longident of path
>    | `Nil] as 'b)
> 
> But if I tried a slightly different definition:
> 
>      let rec scope_term sc  = function
>        | #lambda as t -> scope_term_lambda scope_term sc t
>        | `Nil -> `Nil
>        | `Cons(h,t) -> `Cons(scope_term sc h,scope_term_lst scope_term
> sc t)
> 
> Then I do get the type I expect:
> 
> val scope_term :
>  Scope.t ->
>  ([< `Apply of 'a * 'a
>    | `Cons of 'a * ([< `Cons of 'a * 'b | `Nil] as 'b)
>    | `Constant of int
>    | `Function of Ident.t * 'a
>    | `Let of Ident.t * 'a * 'a
>    | `Longident of path
>    | `Nil] as 'a) ->
>  ([> `Apply of 'c * 'c
>    | `Cons of 'c * ([> `Cons of 'c * 'd | `Nil] as 'd)
>    | `Constant of int
>    | `Function of Ident.t * 'c
>    | `Let of Ident.t * 'c * 'c
>    | `Longident of path
>    | `Nil] as 'c) 
> 
> Does anyone have any ideas?
> 
> Thanks, 
> 
> -D

-------------------
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


      reply	other threads:[~2003-05-08  8:48 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-04-30  5:35 Gurr, David (MED, self)
2003-05-08  8:48 ` Jacques Garrigue [this message]

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=20030508174826L.garrigue@kurims.kyoto-u.ac.jp \
    --to=garrigue@kurims.kyoto-u.ac.jp \
    --cc=David.Gurr@med.ge.com \
    --cc=caml-list@inria.fr \
    /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;
as well as URLs for NNTP newsgroup(s).