F#查询递归类型的问题

时间:2011-06-26 06:41:30

标签: f#

我正在尝试创建两种类型,其中一种能够将自己从另一种中移除,例如在此示例中。

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

但这让我得到了“基于此程序点之前的信息查找不确定类型的对象的编译错误。在此程序点之前可能需要类型注释来约束对象的类型。这可能允许查找要解决。“

我不确定我在这里做错了什么。任何帮助将不胜感激

2 个答案:

答案 0 :(得分:4)

即使不重新排序声明,也可以解决问题 - 当F#编译器类型检查Employee声明时,它还不知道workplace.Employees的类型是什么(因为类型没有还没有宣布,所以它不知道Remove方法来自何处。您可以通过添加指定EmployeesResizeArray<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),那么状态应该被隐藏为该类型的私有状态(所以{{1} }可以有Jobs方法。

一般来说,在F#中声明递归类型声明有点不太舒服 - 但是,你不应该经常使用它们。通常,您可以使用更多泛型类型(即Remove可能不需要知道Job类型。)

答案 1 :(得分:2)

试试这个..

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