Использование и ключевое слово в 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, если вы не изменили порядок, в котором они определены.

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