The issue is "what is the type of an inline record"? Internally each inline record in a constructor declaration has its own type, so in particular two different records have distinct types. One way to think of it is that

  type t = A of {i:int} | B of {i:int};;

is morally equivalent to

  type t_internal_A = {i : int};;
  type t_internal_B = {i : int};;
  type t = A of t_internal_A | B of t_internal_B;;

And then (function (A e | B e) -> e.i) does not type-check either -- with the same error message. This comes from the fact that, in OCaml (unlike in SML), records are nominal, have an identity: declaring another record type with the same fields creates a new, incompatible type.

So the answer is: this is a natural, expected consequence of how inline records and how records work in OCaml.

On Thu, Dec 15, 2016 at 9:12 AM, Gabriel Mayr <gabriel.mayr@mail.de> wrote:
 
Hi,
 
I'm using utop version 1.19.3 (using OCaml version 4.03.0).
 
Using an named record in a type definition and afterwards match on multiple constructors works:
# type a = {i:int};;
#type t = A of a | B of a;;
# let x = A {i=10};;
# match x with
| A e | B e -> print_int e.i;;
 
 
Using an unnamed record in a type definition and afterwards match on multiple constructors does not work:
# type t = A of {i:int} | B of {i:int};;
# let x = A {i=10};;
# match x with
| A e | B e -> print_int e.i;;

"Error: The variable e on the left-hand side of this or-pattern has type t.A but on the right-hand side it has type t.B"
 
 
 
I don't know if this is behaviour of OCaml is desired or it's a fault.
 
Hope I could help you with this little hint.
 
Best regards,
 
Gabriel


FreeMail powered by mail.de - mehr Sicherheit, Seriosität und Komfort