Come può un valore di tipo:Come creare un valore di struttura dati ricorsivo in (funzionale) F #?
type Tree =
| Node of int * Tree list
avere un valore che fa riferimento sé generato in modo funzionale?
Il valore risultante dovrebbe essere uguale a x nel seguente codice Python per un adeguato definizione di albero:
x = Tree()
x.tlist = [x]
Edit: Ovviamente più spiegazione è necessaria. Sto cercando di imparare F # e la programmazione funzionale, quindi ho scelto di implementare lo cover tree che ho programmato prima in altre lingue. La cosa rilevante qui è che i punti di ogni livello sono un sottoinsieme di quelli del livello sottostante. La struttura concettualmente va al livello -infinità.
In lingue imperative un nodo ha una lista di bambini che include se stessa. So che questo può essere fatto imperativamente in F #. E no, non crea un ciclo infinito dato l'algoritmo dell'albero della copertura.
Potete approfondire la questione, per quelli di noi che non parlano molto Python? La definizione del tuo tipo sembra soddisfacente, ma nota che F # non consente la costruzione diretta di un tipo di Unione discriminata (ad es., Albero) ... solo la costruzione dei valori di unione; ad es., Nodo, come in "let x = Node (0, [])" o "let y = Node (1, [x])", dove [] è la lista vuota. –
@James: Vuole creare un nodo che sia figlio suo. Come 'let rec x = Node (something, [x])' (eccetto che non funziona). – sepp2k
@ sepp2k: Generalmente questo crea un ciclo infinito per qualsiasi codice che passi l'elenco, anche se ...altamente indesiderabile :-) Ho visto questo fatto in altre lingue per segnare la fine di una lista, ma F # idomatic userebbe un altro valore DU, come "Nessuno", per quello scopo. –