Thanks for the answers. I see now the difficulty in this. (Though it seems possible in theory if we required type annotations in various places.)

On Tue, Aug 4, 2015 at 5:21 AM, Goswin von Brederlow <goswin-v-b@web.de> wrote:
On Fri, Jul 31, 2015 at 09:48:13AM -0400, Ashish Agarwal wrote:
> I have:
>
> type _ t =
> | Foo1 : 'a * int -> int t
> | Foo2 : 'a * string -> 'a t
>
> but I really want to merge these two cases. I want the return type to be
> based on the second arg when the second arg is int, and be based on the
> first arg otherwise. Any way to accomplish that?

Say you had (imaginary syntax):

type _ t =
| Foo : 'a * int -> int t
| Foo : 'a * string -> 'a t

let x1 = Foo (1, 1)     : int t
let x2 = Foo (1, "x")   : int t

match (x : int t) with
| Foo (a, b) -> ...

What is the type of (a, b) now? Is it (int, int) or (int, string)?

MfG
        Goswin

--
Caml-list mailing list.  Subscription management and archives:
https://sympa.inria.fr/sympa/arc/caml-list
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs