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

时间:2014-12-14 03:42:48

标签: graph f# immutability mutability

我试图在F#

中做一个循环图

我的节点类型如下所示:

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

我的问题是:为了有周期,我是否需要让Edges可变?

1 个答案:

答案 0 :(得分:7)

F#可以使用循环创建即时递归对象引用,但这实际上只适用于(相当简单的)记录。所以,如果你按照你的定义尝试这个,它就不会起作用:

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

但是,你仍然可以避免变异 - 一个合理的选择是使用惰性值:

type Node = { Value : int; Edges : Lazy<Node list>}

这样,你就可以给编译器足够的时间&#34;在需要评估边缘(并再次访问loop值)之前创建loop值:

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

在实践中,您可能想要调用一些函数来创建边缘,但这也应该有效。你应该可以写例如Edges = lazy (someFancyFunction loop)

或者,您也可以使用seq<Edges>(因为默认情况下序列是惰性的),但每次都会重新评估边缘,所以您可能不想这样做。