Я думаю, что литералы должны быть в верхнем регистре.Следующее прекрасно работает:
[<Literal>]
let One = 1
[<Literal>]
let Two = 2
let trymatch x =
match x with
| One -> printfn "%A" One
| Two -> printfn "%A" Two
| _ -> printfn "none"
trymatch 3
Кроме того, если вам нужно хорошее общее решение для этого без использования литералов, вы можете определить параметризованный активный шаблон следующим образом:
let (|Equals|_|) expected actual =
if actual = expected then Some() else None
Итогда просто напишите
let one = 1
let two = 2
let trymatch x =
match x with
| Equals one -> printfn "%A" one
| Equals two -> printfn "%A" two
| _ -> printfn "none"