请考虑以下简单示例:
type Parent = { Children : Child list }
and Child = { Value : int ; Parent : Parent }
let rec children = [ { Value = 0 ; Parent = parent } ]
and parent = { Children = children }
Run Code Online (Sandbox Code Playgroud)
F#编译器非常智能,可以正确初始化这些递归对象,可以通过运行验证
obj.ReferenceEquals(parent, parent.Children.Head.Parent)
Run Code Online (Sandbox Code Playgroud)
现在,考虑以下概括:
let length = 100 // assume arbitrary
let rec children = List.init length (fun i -> { Value = i ; Parent = parent })
and parent = { Children = children }
Run Code Online (Sandbox Code Playgroud)
此定义将导致编译器错误.我的问题如下:有没有办法在不诉诸反射或可变字段的情况下进行上述绑定?
des*_*sco 15
let rec mkChild i = {Value = i; Parent = parent}
and parent = { Children = children }
and children = List.init length mkChild
Run Code Online (Sandbox Code Playgroud)