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