F # rende possibile creare riferimenti di oggetti ricorsivi immediati con cicli, ma in realtà funziona solo su record (abbastanza semplici). Quindi, se si tenta questo dalla tua definizione non funziona:
let rec loop =
{ Value = 0;
Edges = [loop] }
Tuttavia, è ancora possibile evitare mutazione - una ragionevole alternativa è quella di utilizzare i valori pigri:
type Node = { Value : int; Edges : Lazy<Node list>}
In questo modo, stanno dando il compilatore "tempo sufficiente" per creare un valore loop
prima che deve valutare i bordi (e accedere nuovamente il valore loop
):
let rec loop =
{ Value = 0;
Edges = lazy [loop] }
In PRAC tice, probabilmente vorrai chiamare alcune funzioni per creare i bordi, ma dovrebbe funzionare anche tu. Dovresti essere in grado di scrivere ad es. Edges = lazy (someFancyFunction loop)
.
In alternativa, è possibile utilizzare anche seq<Edges>
(in quanto le sequenze sono pigri per impostazione predefinita), ma questo dovrebbe rivalutare i bordi ogni volta, quindi probabilmente non si vuole farlo.
fonte
2014-12-14 04:24:41