Это возможно через модуль Obj
.Анализ объектов с помощью функций Obj
, если все сделано правильно, не приведет к сбою вашей программы;но вы должны быть осторожны, если хотите получить значимые результаты.
let equal_constructors (x : 'a) (y : 'a) =
let r = Obj.repr x and s = Obj.repr y in
if Obj.is_int r && Obj.is_int s then (Obj.obj r : int) = (Obj.obj s : int) else
if Obj.is_block r && Obj.is_block s then Obj.tag r = Obj.tag s else
false
При вызове значений типа варианта (не полиморфного типа варианта) эта функция возвращает true
, если оба значенияимеют одинаковый конструктор с нулевым аргументом или оба имеют одинаковый конструктор с 1 или более аргументами, и false
в противном случае.Система типов не помешает вам использовать equal_constructors
в других типах;вы получите true
или false
возвращаемое значение, но не обязательно значащее.