Использование ключевого слова and в F # в дискриминируемых союзах

Сегодня я столкнулся со следующими декларациями DU:

type Grammar = Definition list

and  Definition = Def of string * Expression

and  Range =
     | Char  of char
     | Range of char * char

Зачем здесь использовать ключевое слово and вместо type?


person devoured elysium    schedule 22.08.2011    source источник


Ответы (2)


and необходим для правильной компиляции определений Grammar и Definition. Тип Grammar указывается первым, но зависит от типа Definition, который определяется позже. Для правильной компиляции он должен быть связан с and, который сообщает компилятору F #, что определения типов зависимы / связаны.

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

person JaredPar    schedule 22.08.2011
comment
Кроме того, Grammar можно было бы разместить после объявления Definition, и тогда у них не было бы причин использовать and для любого из них. - person Samuel; 23.08.2011

Он используется для создания взаимосвязанных типов. Обычно в F # вам нужно пересылать объявление каждого типа перед его использованием, но это не всегда возможно, например, когда вам нужно ввести циклическую зависимость для двух или более типов.

В вашем примере, если вы определили Definition с type, а не and, вы не сможете скомпилировать определение Grammar, если вы не измените порядок, в котором они определены.

Опубликованный вами пример кода не совсем удачный, потому что в нем нет необходимости во взаимных отношениях - вы можете изменить порядок. (Если ниже не было определено еще несколько типов, зависящих от вышеизложенного).

person Mark H    schedule 22.08.2011