Использование и ключевое слово в F # в дискриминационных объединениях
Сегодня я столкнулся со следующими объявлениями DU:
type Grammar = Definition list
and Definition = Def of string * Expression
and Range =
| Char of char
| Range of char * char
Зачем использовать ключевое слово and
вместо type
, здесь?
Ответы
Ответ 1
Для правильной компиляции для Grammar
и Definition
требуется and
. Тип Grammar
указан первым, но зависит от типа Definition
, который определен ниже. Для правильной компиляции он должен быть связан с and
, который сообщает компилятору F #, что определения типов зависят/связаны.
Нет причин для объявления Range
таким образом и должен быть объявлен с помощью type
Ответ 2
Используется для создания взаимно связанных типов. Обычно в F # вам нужно переслать объявление каждого типа перед его использованием, но это не всегда возможно, например, когда вам нужно ввести циклическую зависимость от двух или более типов.
В вашем примере, если вы определили Definition
с type
, а не and
, вы не сможете скомпилировать определение Grammar
, если вы не изменили порядок, в котором они определены.
Пример кода, который вы опубликовали, не совсем хорош, потому что в нем нет взаимосвязи, вы можете изменить порядок. (Если не было еще нескольких типов, определенных ниже, которые зависели от вышеизложенного).