永远不会匹配此规则:为什么?

This rule will never be matched: Why?

我有以下功能:

let hasColumnValue<'columnType> columnName (value: 'columnType) (row: KeyValuePair<int, ObjectSeries<string>>) =
    let columnValue =
        Series.get columnName row.Value :?> 'columnType

    match columnValue with
    | value -> true
    | _ -> false

默认模式匹配被标记为“永远不会匹配此规则”

=> 我不明白为什么

提前致谢

原因是您无法对值进行模式匹配,因此第一种情况可以作为包罗万象的方式。我建议用 columnValue = value.

替换整个匹配表达式

第一个模式始终匹配,因为它绑定到变量。如果存在具有相同名称的变量,它将被隐藏。但是,如果 name 指的是 literal 绑定,那么当 value 等于基础常量 value

时模式成功
let x = 1
[<Literal>] 
let Three = 3

match 2 with
| Three -> printfn "Three"
| x -> printfn "%d" x 
// prints 2

match 3 with
| Three -> printfn "Three"
| x -> printfn "%d" x 
// prints Three

在你的情况下,使用相等而不是模式匹配是最清楚的

 let hasColumnValue<'columnType when 'columnType: equality> columnName (value: 'columnType) (row: KeyValuePair<int, ObjectSeries<string>>) =
    let columnValue =
        Series.get columnName row.Value :?> 'columnType

    columnValue = value