用途:在完成 F# 改动前,对自身 diff 做惯用法审查,重点针对从 C# 逐行移植后保留 C# 形态的代码。资料称编译器会接受 C# 风格的 F#,但人工评审常要求改写;该技能不重复 parse-dont-validate 的领域建模内容。
主要检查项:命名结果用 record 而非元组(三个以上值或两个同类型值);用 option 替代 out 参数或 bool * value;对离散值用 match 而非 if/elif(有序数值区间仍用 if/elif);用表达式与 List.sumBy、List.fold、List.map 替代 let mutable 加循环或分支;用 List.tryFind 等替代带提前退出的循环;避免对 F# 列表用位置索引(xs.[i]、List.item 从头遍历,0..Length-1 循环为二次复杂度),改用 List.mapi、List.iteri、List.indexed,随机访问用数组;一次遍历足够时避免链式多次遍历,seq 不要重复枚举,可用 List.ofSeq 物化或一次 fold 聚合;在 task、async 等计算表达式中用 match! 而非 let! 后接 match;共享值用 static member val 或模块级 let,而非每次访问都求值的 static member X = expr;生成代码或标记用语法 API(Fantomas Oak 和 Ast、Roslyn SyntaxFactory、XElement、Utf8JsonWriter)而非字符串拼接。
使用方式:先列出 diff 中所有元组返回、bool * value、out 参数、if/elif 链、let mutable、for/while 循环、列表索引、链式集合遍历、let! 后接 match、带计算值的 static member、字符串构建代码;逐项套用检查项或保留并说明理由(可接受理由:实测热路径、.NET API 要求该形态、if/elif 用于有序数值区间);随后重新运行代码与测试,公开行为不得改变。验证可运行 pwsh ./scripts/run.ps1,脚本会对比 before 与 after 形态结果是否一致,并演示 static member 与 static member val 的求值差异。
限制:资料未提供安装方式、平台要求、收费信息与更多例外说明;references/EXAMPLES.md 含更长示例与例外。