Вы не можете создавать наборы разнородных элементов. Конечно, вы можете определить тип для объединения типов, если вы знаете их заранее. Похоже, что вы делаете, и это может быть рекурсивный тип, определенный как:
type ('a,'b) r = | L of 'a
| N of (('a,'b) r * 'b)
Таким образом, ваши примеры будут построены как
N (L a,1)
N ( N (L a,1),1)
N ( N ( N (L a,1),1),1)
Тогда вы просто скомпонуете модуль Ordered, чтобы включить функцию сравнения.
В случае создания декартова произведения вы не будете иметь дело с гетерогенными элементами на данном этапе, а с кортежем предыдущего типа. Это потребует нового упорядоченного модуля для обработки этих сравнений.