F#中的递归映射引用

Bat*_*bix 5 f#

我正在尝试在F#中创建一个递归映射.

type RecMap = Map<string, RecMap>

因为循环引用而无法工作RecMap.但为什么不这样呢

type RecMap = Map<string, RecMap ref>

也不

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

作品?我认为将地图的值类型设为a RecMap ref应该已经完成​​了.

通过重写RecMap为一个成员记录类型来解决问题,

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

记录就像引用类型一样ref,但是为什么不在引用的情况下引用递归定义?

kvb*_*kvb 6

您的初始尝试是类型缩写,而您的上次尝试是定义新类型.在编译期间,缩写通过替换被删除.由于你有一个循环定义(即使它通过包含的附加级别ref),替换永远不会终止.

我可能会这样做:

type RecMap = RecMap of Map<string, RecMap>
Run Code Online (Sandbox Code Playgroud)