我正在尝试创建两种类型,其中一种能够将自己从另一种中移除,例如在此示例中。
type employee (workplace : Job) =
member this.Fire () = workplace.Employees.Remove(this) |> ignore
and Job () =
let employees = new ResizeArray<employee>()
member this.Employees = employees
但这让我得到了“基于此程序点之前的信息查找不确定类型的对象的编译错误。在此程序点之前可能需要类型注释来约束对象的类型。这可能允许查找要解决。“
我不确定我在这里做错了什么。任何帮助将不胜感激
答案 0 :(得分:4)
即使不重新排序声明,也可以解决问题 - 当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
),那么状态应该被隐藏为该类型的私有状态(所以{{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