2014-12-14 17 views

risposta

7

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.