字符匹配discriminated union时仅首个分支生效的原因及解决方案
问题原因
你的代码存在两个核心问题导致警告出现:
- 模式匹配分支中的
H/S/N没有加单引号,F#不会将其识别为字符字面量,而是将其判定为匹配任意输入的变量绑定规则,因此第一个分支会命中所有输入值,后续分支永远不会被触发。 - 你定义的可区分联合类型名为小写
tool,调用时却使用了大写开头的Tool,F#大小写敏感,这也会额外触发编译错误。
修复方案
首先统一类型命名规范(F#惯例采用Pascal大小写命名可区分联合),给字符匹配项加上单引号,建议额外补充兜底分支避免非法输入触发运行时匹配异常:
type Tool = | Hammer | Screwdriver | Nail let getTool (letter: char) = match letter with | 'H' -> Tool.Hammer | 'S' -> Tool.Screwdriver | 'N' -> Tool.Nail | _ -> invalidArg (nameof letter) $"无效的工具标识字符:{letter}"
如果需要支持大小写不敏感的匹配,可以先对输入字符做标准化处理:
let getToolCaseInsensitive (letter: char) = match System.Char.ToUpperInvariant(letter) with | 'H' -> Tool.Hammer | 'S' -> Tool.Screwdriver | 'N' -> Tool.Nail | _ -> invalidArg (nameof letter) $"无效的工具标识字符:{letter}"
内容的提问来源于stack exchange,提问作者Alex_P
相关产品推荐
相关产品推荐

