Проблемы с поиском в F # для рекурсивных типов - PullRequest
4 голосов
/ 26 июня 2011

Я пытаюсь создать два типа, где один может удалить себя от другого, как в этом примере.

type employee (workplace : Job) =
    member this.Fire () = workplace.Employees.Remove(this) |> ignore
and Job () =
    let employees = new ResizeArray<employee>()
    member this.Employees = employees

Но это приводит меня к ошибке компиляции "Lookup для объекта неопределенного типа на основе информации, предшествующей этой программной точке. Перед этой программной точкой может потребоваться аннотация типа, чтобы ограничить тип объекта. Это может позволить поиск должен быть решен. "

Я не уверен, что я делаю здесь не так. Любая помощь будет оценена

Ответы [ 2 ]

4 голосов
/ 26 июня 2011

Вы можете решить проблему, даже не переупорядочивая объявления - когда компилятор 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).

2 голосов
/ 26 июня 2011

Попробуйте это ..

type Job () =
    let employees = new ResizeArray<employee>()
    member this.Employees = employees
and employee (workplace : Job) =
    member this.Fire () = workplace.Employees.Remove(this) |> ignore
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...