这段F#代码
let rec reformat = new EventHandler(fun _ _ ->
b.TextChanged.RemoveHandler reformat
b |> ScrollParser.rewrite_contents_of_rtb
b.TextChanged.AddHandler reformat
)
b.TextChanged.AddHandler reformat
Run Code Online (Sandbox Code Playgroud)
导致以下警告:
traynote.fs(62,41):警告FS0040:通过使用延迟引用,将在运行时检查对正在定义的对象的这种和其他递归引用的初始化 - 健全性.这是因为您定义了一个或多个递归对象,而不是递归函数.使用'#nowarn"40"'或'--nowarn:40'可以抑制此警告.
有没有一种方法可以重写代码以避免此警告?或者在F#中是否没有犹太人使用递归对象的方式?
我有一个记录:
type node = {
content : string;
parent : node option;
branch : string option;
children : seq<node> option;
}
Run Code Online (Sandbox Code Playgroud)
我想以这种方式实例化:
let rec treeHead = {
content = "Value"
parent = None;
branch = None;
children = tree (Some(treeHead)) rows;
};
Run Code Online (Sandbox Code Playgroud)
哪里
let rec tree (parent:node option) (rows:seq<CsvRow>) :seq<node> option
Run Code Online (Sandbox Code Playgroud)
是一个获取节点子节点(构造树)的递归函数.因此,您可以看到对象treeHead需要通过树函数调用自身.
我想以这种方式避免使用treeHead作为可变值并在之后更改其子属性.
我的问题是treeHead会引发错误和警告.错误说:
值'treeHead'将作为其自己定义的一部分进行评估.
警告说:
通过使用延迟引用,将在运行时检查对定义的对象的这个和其他递归引用的初始化 - 健全性.这是因为您定义了一个或多个递归对象,而不是递归函数.使用'#nowarn"40"'或'--nowarn:40'可以抑制此警告.
首先,我是以正确的方式做到这一点(我的意思是,不考虑可变选择)?我该如何纠正这个问题.