相关疑难解决方法(0)

F#中的递归对象?

这段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#中是否没有犹太人使用递归对象的方式?

recursion f#

7
推荐指数
1
解决办法
1173
查看次数

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'可以抑制此警告.

首先,我是以正确的方式做到这一点(我的意思是,不考虑可变选择)?我该如何纠正这个问题.

recursion f#

4
推荐指数
1
解决办法
396
查看次数

标签 统计

f# ×2

recursion ×2