我希望能在F#中制作一个循环图。
我的节点类型大致如下:
type Node = { Value : int; Edges : Node list }
我的问题是:我需要使边缘可变才能拥有循环吗?
我希望能在F#中制作一个循环图。
我的节点类型大致如下:
type Node = { Value : int; Edges : Node list }
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>
(由于序列默认是惰性的),但这将每次重新评估边缘,因此您可能不想这样做。