2010-11-10 5 views
5

J'essaye de créer une carte récursive en F #.Référence de la carte récursive en F #

type RecMap = Map<string, RecMap>

ne fonctionnera pas, à cause de la référence cyclique RecMap. Mais pourquoi est-il que ni

type RecMap = Map<string, RecMap ref>

ni

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

œuvres? Je pensais que faire le type de valeur de la carte dans un RecMap ref aurait dû faire l'affaire.

Contourner le problème en réécrivant RecMap en un membre travaille de type d'enregistrement,

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

Les enregistrements sont les types de référence, tout comme ref, mais pourquoi ne fonctionnent pas refs dans les définitions récursives, lorsque les enregistrements font?

Répondre

6

Vos tentatives initiales sont type abbreviations, tandis que votre dernière tentative définit un nouveau type. Pendant la compilation, les abréviations sont effacées par substitution. Puisque vous avez une définition cyclique (même si elle passe par un niveau supplémentaire avec l'inclusion de ref), la substitution ne se terminera jamais.

Je ferais probablement ceci:

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

Aka, abréviation de type - http://msdn.microsoft.com/en-us/library/dd233246.aspx –

+0

@Tony - merci, je J'ai mis à jour ma réponse pour être plus précis. – kvb

Questions connexes