我有以下功能:
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
默认模式匹配标记为"此规则将永远不会被匹配">
=比;我不明白为什么
Thanks in advance
第一个模式总是匹配的,因为它绑定到变量。如果存在同名的变量,它将被遮蔽。但是,如果name引用文字绑定,则如果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
原因是您无法对值进行模式匹配,因此第一种情况充当了包罗万象的角色。我建议将整个匹配表达式替换为columnValue = value
。