5

我正在尝试在 F# 中做一个循环图

我的节点类型如下所示:

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

我的问题是:我是否需要使 Edges 可变才能产生循环?

4

1 回答 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>(因为默认情况下序列是惰性的),但这会每次都重新评估边缘,所以您可能不想这样做。

于 2014-12-14T04:24:41.473 回答