F#中的递归映射引用

时间:2010-11-10 19:40:36

标签: 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一样,但是当记录出现​​时,为什么refs不能在递归定义中工作?

1 个答案:

答案 0 :(得分:6)

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

我可能会这样做:

type RecMap = RecMap of Map<string, RecMap>