F#中创建类或记录时如何实现自引用?
方案1:用递归值绑定实现自引用记录
你最初定义的记录本身没有问题,只需要用F#的递归值绑定语法let rec即可直接创建自引用的初始节点,不需要修改字段类型为Node option:
type Node = { mutable Next: Node mutable Prev: Node Value: int } // 创建值为0、前后引用均指向自身的初始节点 let rec initialNode = { Next = initialNode Prev = initialNode Value = 0 }
后续对节点Next、Prev字段的修改操作和预期完全一致,没有额外的语法负担。
方案2:修正类的实现逻辑
你之前的类实现报错,是因为次级构造函数调用主构造时,this实例还未完成初始化,无法作为参数直接传递。你可以调整构造函数的执行顺序,用then关键字在实例初始化完成后再赋值Next、Prev,即可实现和你给出的C#代码完全等价的功能:
type Node private (value: int) as this = let mutable _next = this let mutable _prev = this let _value = value // 公开的三参数构造函数 new(value: int, next: Node, prev: Node) as this = // 先调用私有主构造完成基础初始化,此时this实例已可用 Node(value) then // 再赋值传入的前后节点引用 _next <- next _prev <- prev member this.Next with get() = _next and set(v) = _next <- v member this.Prev with get() = _prev and set(v) = _prev <- v member this.Value = _value static member Initial value = Node(value)
调用Node.Initial 0即可直接得到符合要求的自引用初始节点。
内容的提问来源于stack exchange,提问作者AndreySarafanov
相关产品推荐
相关产品推荐

