Во втором сопоставлении с образцом у вас есть две разные переменные lst
с одинаковыми именами. Здесь
let lst = [1;2]
match a with
| lst -> "1 and 2"
| _ -> "Other"
в первом случае совпадения вы не ссылаетесь на переменную lst
выше, вы создаете новую. Вы можете проверить это, попытавшись изменить его имя (F2 в Visual Studio). Как объясняет AMieres, дело важно.
В общем, обращение к переменной в случае совпадения выполнимо, но не тривиально.
Рассмотрим этот код:
let helloWorld = "hello world"
let isHelloWorld s =
match s with
| helloWorld -> true
| _ -> false
Здесь вы получите такое же предупреждение, как описано. Один из способов - пометить константу атрибутом [<Literal>]
и одновременно сделать ее заглавной:
[<Literal>]
let HelloWorld = "hello world"
let isHelloWorld s =
match s with
| HelloWorld -> true
| _ -> false
Это будет работать как ожидалось. Однако вы можете применить атрибут [<Literal>]
только к определенным типам , и список не входит в их число. Для этого вы должны использовать условия when
в случаях совпадения.