gpt4 book ai didi

class - 在 F# 中创建类或记录时的自引用

转载 作者:行者123 更新时间:2023-12-04 14:46:26 26 4
gpt4 key购买 nike

我学习 F# 并通过解决 Advent of Code 2018 来实现。one task我想写一个循环链表:每个节点都应该有指向下一个和前一个节点的链接。一个节点的列表是有效的,该节点既是其自身的下一个又是其前一个。

这是我最初想出的记录:

type Node = {
mutable Next: Node
mutable Prev: Node
Value: int
}

但是后来我发现我无法实例化值为0的初始节点并链接到自身。然后我尝试写一个类,但仍然没有写出我需要的合法构造函数。这是我的尝试:

type Node(value: int, next: Node, prev: Node) as this =
let mutable _next = next
let mutable _prev = prev
let _value = value

private new value =
Node(value, this, this) // this line is illegal

member this.Next
with get() = _next
and set(value) = _next <- value

member this.Prev
with get() = _prev
and set(value) = _prev <- value

member this.Value
with get() = _value

static member Initial value =
Node(value)

这是我想要实现的 C# 等价物:

    public class Node {
public Node Next { get; set; }
public Node Prev { get; set; }
public int Value { get; }

public Node(int value, Node next, Node prev)
{
Value = value;
Next = next;
Prev = prev;
}

private Node(int value)
{
Value = value;
Next = this;
Prev = this;
}

public static Node Initial(int value)
{
return new Node(value);
}
}

我知道我可以将 Next 和 Prev 设为 Node option 类型,但由于语法限制,这意味着我的代码会变得更糟。 应该 F# 语法中有一些我遗漏的东西。尝试使用谷歌搜索并搜索类似的问题,但无济于事。

如何在 F# 中创建记录或类时设置指向自身的链接?

最佳答案

这可以通过以下方式使用具有可变字段的记录来实现:

type Node = {
mutable Next: Node
mutable Prev: Node
Value: int
}
with
static member CreateNew(value) =
let node =
{
Next = Unchecked.defaultof<_>
Prev = Unchecked.defaultof<_>
Value = value
}
node.Next <- node
node.Prev <- node
node

Node.CreateNew(1)

您可以使用 Unchecked.defaultof<_> 绕过记录的正常不可空性.只需确保在返回之前将其设置为非空值即可。

关于class - 在 F# 中创建类或记录时的自引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69949878/

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