这个规则永远不会被匹配:为什么?

  • 本文关键字:规则 永远 f#
  • 更新时间 :
  • 英文 :


我有以下功能:

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

最新更新