gpt4 book ai didi

F# 递归类型的查找问题

转载 作者:行者123 更新时间:2023-12-02 18:12:19 26 4
gpt4 key购买 nike

我正在尝试创建两种类型,其中一种类型能够将自身从另一种类型中删除,如本例所示。

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

但这给我带来了编译错误“根据此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型注释来约束对象的类型。这可能允许查找待解决。”

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

最佳答案

即使不重新排序声明,您也可以解决问题 - 当 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 ),那么该状态应该隐藏为该类型的私有(private)状态(因此 Jobs 可以有一个Remove方法)。

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

关于F# 递归类型的查找问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6482536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com