Gerd's reply covers most of the important points. I just wanted to add: On 16 February 2015 at 00:06, Jean Saint-Remy wrote: > I could not declare the fields for example as a polymorphic tuple for > instance: "type idref = { mutable 'a * 'b -> 'a }" nor "type idref = { > mutable 'a. 'b -> 'a }". The latter is just nonsense, the 'b is undefined. > But we could have a two field record by just repeating the type > definitions. "let idref = { mutable 'a. 'a -> 'a; mutable 'b. 'b -> 'b }". > The polymorphic type does not have any restriction, it appears we could > have any fundamental type we wanted. The type 'a variable must be repeated, > it is not enough to say "type idref = { mutable 'a. -> 'a };;" Is it > correct then to read the declaration in this way: the type 'a polymorphic > type as a polymorphic variable of type 'a. I know it sounds redundant, but > that is how I am reading the syntax. > All the pieces of record syntax in this quoted paragraph are missing a field name. Where you say things like "type idref = { mutable 'a * 'b -> 'a }", you probably mean something like "type idref = { mutable fst : 'a 'b . 'a * 'b -> 'a }" -- notice the name of the field, followed by the colon, which always comes before the type, including any 'a . -style variable bindings it might start with.