F#模式匹配提示「This rule will never be matched」的原因是什么?
警告触发原因
你代码中的模式匹配写法存在变量绑定逻辑误解:
- F# 模式匹配中,出现在
|右侧的小写开头标识符默认是新变量绑定规则,不会引用当前作用域内已存在的同名变量 - 你写的
| value -> true里的value会绑定columnValue的所有可能值,意味着所有输入都会命中第一个分支,第二个| _ -> false分支自然永远不会被执行,所以编译器给出该警告。
修复方案
有两种常用修改方式可以实现你想要的「判断列值是否等于入参value」的逻辑:
- 给匹配分支添加
when守卫,显式判断值相等,同时补充泛型相等约束:
let hasColumnValue<'columnType when 'columnType : equality> columnName (value: 'columnType) (row: KeyValuePair<int, ObjectSeries<string>>) = let columnValue = Series.get columnName row.Value :?> 'columnType match columnValue with | v when v = value -> true | _ -> false
- 更简化的写法,直接返回相等判断结果即可,不需要写冗余的模式匹配:
let hasColumnValue<'columnType when 'columnType : equality> columnName (value: 'columnType) (row: KeyValuePair<int, ObjectSeries<string>>) = let columnValue = Series.get columnName row.Value :?> 'columnType columnValue = value
内容的提问来源于stack exchange,提问作者Digital Stoic
相关产品推荐
相关产品推荐

