2010-11-10 11 views
5

Sto provando a creare una mappa ricorsiva in F #.Riferimento mappa ricorsiva in F #

type RecMap = Map<string, RecMap>

non funziona, perché il riferimento ciclico RecMap. Ma perché è che né

type RecMap = Map<string, RecMap ref>

type RecMap = (Map<string, RecMap>) ref

opere? Ho pensato che rendere il tipo di valore della mappa in un RecMap ref avrebbe dovuto fare il trucco.

eludere il problema riscrivendo RecMap in un uno dei membri di tipo record di opere,

type RecMap = { r : Map<string, RecMap> }

Records sono tipi di riferimento, proprio come ref, ma perché il lavoro non arbitri nelle definizioni ricorsive, quando i record fanno?

risposta

6

I tentativi iniziali sono type abbreviations, mentre l'ultimo tentativo definisce un nuovo tipo. Durante la compilazione, le abbreviazioni vengono cancellate per sostituzione. Dato che hai una definizione ciclica (anche se passa attraverso un livello aggiuntivo con l'inclusione di ref), la sostituzione non terminerà mai.

probabilmente sarei fare questo, invece:

type RecMap = RecMap of Map<string, RecMap> 
+0

Aka, tipo sigla - http://msdn.microsoft.com/en-us/library/dd233246.aspx –

+0

@Tony - grazie, I' Ho aggiornato la mia risposta per essere più preciso. – kvb