Учебник по F# включает следующий фрагмент:
/// A record for a person's first and last name
type Person = {
First : string
Last : string
}
/// define a discriminated union of 3 different kinds of employees
type Employee =
| Engineer of Person
| Manager of Person * list<Employee> // manager has list of reports
| Executive of Person * list<Employee> * Employee // executive also has an assistant
Тот факт, что Manager и Executive описываются как кортежи, оскорбляет мои чувства (меня легко обидеть). Мне кажется, что это не очень выразительно. Я попытался изменить их следующим образом:
/// define a discriminated union of 3 different kinds of employees
type Employee =
| Engineer of Person
| Manager of { Name: Person; Reports: Employee list } // manager has list of reports
| Executive of { Name: Person; Reports: Employee list; Assistant: Employee} // executive also has an assistant
К сожалению, определения Manager и Executive теперь выдают ошибку: «Эта конструкция устарела; рассмотрите возможность использования вместо нее отдельного типа записи». Хорошо, кажется справедливым, давайте назовем его ManagerType. Но подождите... ManagerType относится к Employee (для части Reports), а Employee относится к ManagerType (для опции Manager).
Есть ли здесь решение? Разве две структуры данных не могут быть определены в терминах друг друга?