@zm_sansan

Как узнать конструктор объекта и сравнить с другим конструктором в F#?

Допустим имеется тип Type. A, A1, B, B1, B2, B, C - некие типы.
type Type = | Cons1 A A1 | Cons2 B B1 B2 | Cons3 C

И имеется функция, которая принимает два объекта типа Type.
Функция должна выдавать true, если конструкторы объектов одинаковые, false в противном случае.

Я не смог найти в F# функцию для извлечения конструктора и сравнения его с другим.
Всевозможный ручной перебор комбинаций конструкторов слишком затратный в реальной программе, так как имеется много конструкторов.
Подскажите, возможно ли такое реализовать и если да, то как, а если нет, то какие пути обхода существуют.
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
@zm_sansan Автор вопроса
Узнав одинаковые конструкторы или нет я могу судить о том что эти объекты схожи по своей внешней структуре, абстрагируясь от аргументов.
Нашёл решение.
open Microsoft.FSharp.Reflection
let cons (x:'a) = ((FSharpValue.GetUnionFields(x, typeof<'a>)) |> fst).Name
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Melz
Я, если честно, не погу себе представить зачем это нужно делать в функциональном языке и как вы собираетесь использовать результат. Там будет костыль на костыле.

Проще всего сделать интерфейс и проверять имплементирует ли его объект как-то так


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# идет довольно много разных вещей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы