我正在尝试在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不能在递归定义中工作?
答案 0 :(得分:6)
您最初的尝试是type abbreviations,而您上一次尝试定义的是新类型。在编译期间,缩写通过替换被删除。由于你有一个循环定义(即使它通过包含ref
的附加级别),替换也永远不会终止。
我可能会这样做:
type RecMap = RecMap of Map<string, RecMap>