2010-11-10 129 views
5

我試圖在F#中創建一個遞歸映射。F#中的遞歸映射參考

type RecMap = Map<string, RecMap>

不會起作用,因爲的循環參考RecMap。但爲什麼既不

type RecMap = Map<string, RecMap ref>

也不

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

的作品?我認爲把地圖的價值類型變成RecMap ref應該已經成功了。

規避重寫RecMap成一個成員記錄類型作品的問題,

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

記錄是引用類型就像ref,但爲什麼在遞歸定義沒有裁判的工作,當記錄嗎?

回答

6

你最初的嘗試是type abbreviations,而你最後一次嘗試定義了一個新類型。在編譯過程中,縮寫通過替換被刪除。既然你已經有了一個循環定義(即使它通過了一個包含ref的額外等級),替代也不會終止。

我可能做到這一點,而不是:

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

阿卡,類型縮寫 - http://msdn.microsoft.com/en-us/library/dd233246.aspx – 2010-11-10 19:50:59

+0

@Tony - 謝謝,我我更新了我的答案,以便更加精確。 – kvb 2010-11-10 19:53:50