Как узнать конструктор объекта и сравнить с другим конструктором в F#?
Допустим имеется тип Type. A, A1, B, B1, B2, B, C - некие типы. type Type = | Cons1 A A1 | Cons2 B B1 B2 | Cons3 C
И имеется функция, которая принимает два объекта типа Type.
Функция должна выдавать true, если конструкторы объектов одинаковые, false в противном случае.
Я не смог найти в F# функцию для извлечения конструктора и сравнения его с другим.
Всевозможный ручной перебор комбинаций конструкторов слишком затратный в реальной программе, так как имеется много конструкторов.
Подскажите, возможно ли такое реализовать и если да, то как, а если нет, то какие пути обхода существуют.
Узнав одинаковые конструкторы или нет я могу судить о том что эти объекты схожи по своей внешней структуре, абстрагируясь от аргументов.
Нашёл решение.
open Microsoft.FSharp.Reflection
let cons (x:'a) = ((FSharpValue.GetUnionFields(x, typeof<'a>)) |> fst).Name
Я, если честно, не погу себе представить зачем это нужно делать в функциональном языке и как вы собираетесь использовать результат. Там будет костыль на костыле.
Проще всего сделать интерфейс и проверять имплементирует ли его объект как-то так
let obj1 : obj = upcast (...)
match obj1 with
| :? ISomeInterface -> (do something)
| _ -> ()
Ну или просто создать новый "тип" с плюшками.
type MixedType =
| Tup of int * int // a tuple
| P of Person // use the record type defined above
| L of int list // a list of ints
| U of IntOrBool // use the union type defined above
Ну и под словом type в F# идет довольно много разных вещей.