Как назначить определенный тип распознаваемому типу объединения в F # - PullRequest
1 голос
/ 06 октября 2019

Предположим, у меня есть следующие типы:

type TypeA = { A: string }
type TypeB = { B: string }

, и у меня есть оба типа объединения для них:

type MyUnionType = TypeA | TypeB

С типом, который просто содержит тип объединения:

type MyContainer = { Union: MyUnionType }

теперь, если я создаю экземпляр одного из типов в типе объединения:

let resultA = { A = "abc" }

, когда я пытаюсь присвоить этому экземпляру значение в контейнере

let result = { Union = resultA }

компилятор жалуется, говоря:

Ошибка компиляции (строка 10, столбец 24): ожидалось, что это выражение будет иметь тип MyUnionType, но здесь имеет тип TypeA

но TypeA является одним из допустимых типов, указанных в объединении! Как я могу присвоить его свойству Union?

Вот пример программы: https://dotnetfiddle.net/fgJKpM

1 Ответ

6 голосов
/ 06 октября 2019

В type MyUnionType = TypeA | TypeB, TypeA и TypeB не ссылаются на предыдущие записи TypeA и TypeB, но являются нулевыми конструкторами для типа MyUnionType. Если вы хотите, чтобы они содержали значения этих типов, вам нужно включить их в определение, например:

type MyUnionType = TypeA of TypeA | TypeB of TypeB

Возможно, вы захотите переименовать конструкторы, чтобы избежать путаницы между ними и содержащимися типами.

затем вам нужно предоставить соответствующий экземпляр конструктору:

let resultA = TypeA { A = "abc" }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...