You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《Real World Functional Programming》第8章递归决策树FSI运行问题

嘿,我看你在写F#递归决策树的时候遇到FSI报错的问题了,帮你排查了下代码里的几个小问题,现在给你修正后的版本和原因说明:

解决F#递归决策树的FSI运行问题

原代码的核心问题:

  • 递归节点(tree、aleft、aright)的绑定顺序错误,还漏掉了bleft的定义,编译器找不到该标识符
  • aright中的Negative = Result...未完成,缺少具体的结果字符串,存在语法残缺
  • 相互递归的变量必须通过and关联,原代码的绑定顺序导致解析tree时,aleft和aright尚未定义,触发报错

修正后的完整可运行代码:

type QueryInfo = { 
    Title: string; 
    Positive: Decision; 
    Negative: Decision 
} 
and Decision = 
    | Result of string 
    | Query of QueryInfo

// 按依赖顺序定义相互递归节点,用and串联所有递归绑定
let rec bleft = Result("Maybe")
and aleft = Query({ Title = "B"; Positive = bleft; Negative = Result("Yes") })
and aright = Query({ Title = "C"; Positive = Result("No"); Negative = Result("Not sure") })
and tree = Query({ Title = "A"; Positive = aleft; Negative = aright })

关键修正逻辑说明:

  1. 调整递归绑定顺序:
    因为aleft依赖bleft,所以要先定义bleft,再用and衔接定义aleft,最后定义最上层的tree。所有相互引用的变量必须用and串联,让F#编译器能识别它们的递归关系。

  2. 补全残缺语法:
    把aright中未写完的Result补全为具体字符串(示例用了"Not sure"),你可以根据实际需求替换成自己需要的结果值。

  3. 类型定义无需修改:
    你最初写的QueryInfo和Decision相互递归类型是正确的,用and连接类型声明的部分完全没问题,问题仅出在后续的节点绑定环节。

现在把这段代码粘贴到FSI 4.1中运行,就能正常生成决策树了,直接调用tree就能查看完整的树结构~

内容的提问来源于stack exchange,提问作者Leo Nistor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:08:55