我正在尝试在 F# 中做一个循环图
我的节点类型如下所示:
type Node = { Value : int; Edges : Node list }
我的问题是:我是否需要使 Edges 可变才能产生循环?
我正在尝试在 F# 中做一个循环图
我的节点类型如下所示:
type Node = { Value : int; Edges : Node list }
我的问题是:我是否需要使 Edges 可变才能产生循环?
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>
(因为默认情况下序列是惰性的),但这会每次都重新评估边缘,所以您可能不想这样做。