Вы можете решить проблему, даже не переупорядочивая объявления - когда компилятор F # проверяет тип объявления Employee
, он еще не знает, каков тип workplace.Employees
(потому что тип не был объявлен пока), поэтому он не знает, откуда берется метод Remove
. Вы можете исправить это, добавив аннотацию типа, которая указывает, что Employees
равно ResizeArray<Employee>
:
type Employee (workplace : Job) =
member this.Fire () =
let emps : ResizeArray<Employee> = workplace.Employees
emps.Remove(this) |> ignore
and Job () =
let employees = new ResizeArray<Employee>()
member this.Employees = employees
Однако этот пример не очень функционален - если вы собираетесь использовать изменяемое состояние (например, ResizeArray
), тогда состояние должно быть скрыто как частное состояние типа (поэтому Jobs
может иметь Remove
метод).
В общем, объявление рекурсивных объявлений типов немного менее удобно в F #, однако вам не нужно их часто. Довольно часто вы можете использовать более общие типы (т. Е. Job
может не потребоваться знать тип Employee
).