No, type:
# # (1,(2,3));;
- : int * (int * int) = (1, (2, 3))
# ((1,2),3);;
- : (int * int) * int = ((1, 2), 3)
# (1,2,3);;
- : int * int * int = (1, 2, 3)
# fst (1,2,3)
Error: This expression has type 'a * 'b * 'c
but an expression was expected of type 'd * 'e
The 3 first tuples have different types. And the last expression shows that a 'a * 'b * 'c is not a pair. It can be compared to a structure with 3 fields. (I guess the memory representation is similar).
Yes, such a representation will permit 0-tuples or 1-tuples. But the idea is to have a grammar which doesn’t permit it. Something like this tuples := expr ( ',' expr )+. (Adapt it to your prefered grammar compiler). Then, in OCaml, you won’t be able to have such tuples. (42) can’t be interpreted as a tuple.