在F#中制作循环图,是否需要可变性?

5

我希望能在F#中制作一个循环图。

我的节点类型大致如下:

type Node = { Value : int; Edges : Node list }

我的问题是:我需要使边缘可变才能拥有循环吗?
1个回答

7

F#可以创建具有循环的立即递归对象引用,但这仅适用于(相当简单的)记录。因此,如果您尝试在您的定义中使用它,它将不起作用:

let rec loop = 
  { Value = 0;
    Edges = [loop] }

然而,您仍然可以避免突变-一个合理的替代方法是使用惰性值:
type Node = { Value : int; Edges : Lazy<Node list>}

这样做,你就给编译器“足够的时间”来创建一个loop值,在需要评估边缘(并再次访问loop值)之前:

let rec loop = 
  { Value = 0;
    Edges = lazy [loop] }

实际上,您可能希望调用一些函数来创建边缘,但这也应该有效。例如,您应该能够编写 Edges = lazy (someFancyFunction loop)

或者,您也可以使用seq<Edges>(由于序列默认是惰性的),但这将每次重新评估边缘,因此您可能不想这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接