В случае обычных конструкторов компилятор может использовать определение типа для различения guish между:
type t = A of int * int | B
let f = function
| A (_,y) -> y
| B -> 0
и
type 'a t = A of 'a | B
let f = function
| A (_,y) -> y
| B -> 0
Таким образом, это можно оптимизировать первый
A (_,y) -> y
в «доступ ко второму полю блока» при одновременной компиляции второго случая
A (_,y) -> y
для «доступа к кортежу в первом поле блок, а затем получить доступ ко второму полю блока ".
Для вариантов polymorphi c невозможно полагаться на несуществующее определение типа, чтобы различать guish между этими двумя Следовательно, их представление в памяти должно быть равномерным. Это означает, что полиморфные c варианты всегда принимают один аргумент, и не очень полезно маркировать каждый аргумент конструктора, когда есть только один аргумент.
Вот почему встроенные записи нельзя комбинировать с вариантами polymorphi c.