N-арные кортежи против пар
В Ocaml кортежи с разными арностями имеют конструкторы разных типов и значений:
# let a = (1, 2, 3);;
val a : int * int * int = (1, 2, 3)
# let b = (1, (2, 3));;
val b : int * (int * int) = (1, (2, 3))
Обратите внимание, что второй пример (б) является более гибким, чем первый (а), потому чтохвост" из b - (2, 3) - само по себе является допустимым значением:
# let (_, c) = b;;
val c : int * int = (2, 3)
# let d = snd b;;
val d : int * int = (2, 3)
В чем причина не разбирать "(1, 2, 3) как "(1, (2, 3)) " и вместо этого ввести бесконечное (или, что еще хуже, конечное) количество конструкторов нового типа и значения для разных арностей?