You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:36:04