When pattern matching it is easy to forget that you are capturing a new value instead of matching against an existing one. Take this function for example:
let E = 2.718281828459 let PI = 3.141592653589 // Ooops - this captures a value let isConstant x = match x with | PI | E -> true | _ -> false
The right way to write this code is to use the [<Literal>] attribute. This tells the F# compiler to treat this value as a constant literal which, among other things, enables it to be used with pattern matching.
[<Literal>] let E = 2.718281828459 [<Literal>] let PI = 3.141592653589 // This matches against the literal value let isConstant x = match x with | PI | E -> true | _ -> false