F#中的递归和不变性

eir*_*rik 7 recursion f#

请考虑以下简单示例:

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)

  • 那么,究竟是什么限制?我在规范中找不到任何东西. (2认同)