Взаимодействующие дела в Дискриминационных Союзах разрешены в F #? - PullRequest
2 голосов
/ 26 августа 2011

Не удалось скомпилировать следующее различающееся объединение:

type Expression =
  | Identifier of string
  | Integer of int
  | Assignment of Identifier * Expression

с показанной ошибкой

The type "Identifier" is not defined.

в последнем случае объединения.

Я пытался пометить Expression атрибутом rec, но это, похоже, бесполезно.

Есть ли обходной путь для этого? А еще лучше, является ли указанная причина причиной моей проблемы?

Ответы [ 2 ]

10 голосов
/ 26 августа 2011

Звучит так, будто вы действительно хотите

| Assignment of string * Expression

или, альтернативно,

type Id = Id of string
type Expression =
    | Identifier of Id
    | Integer of int
    | Assignment of Id * Expression

, если вам нужен дополнительный номинальный тип для всех идентификаторов.

Лучше по возможности исключать бессмысленные значения в системе типов ( бессмысленные состояния не должны быть представимыми ), поэтому я бы избегал Expression в левой частиназначение, если вашему языку это не нужно.

В любом случае, это запрещено, потому что Identifier не является типом (Expression is).

4 голосов
/ 26 августа 2011

Вы не можете этого сделать.Внутри Union вы не можете ссылаться на другой элемент Union.

Так должно быть:

type Expression =
  | Identifier of string
  | Integer of int
  | Assignment of Expression * Expression

Чтобы при анализе объединения присваивания вы могли поместить туда проверку, что первое выражениекортеж должен быть идентификатором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...