Is it possible to do pattern matching on variables instead of constant values:
# let x = 2 in
let y = 5 in
match 2 with
| x -> \"foo\"
| y -> \"bar\"
|
You need when guard:
let x = 2 in
let y = 5 in
match 2 with
| z when z = x -> "foo"
| z when z = y -> "bar"
| _ -> "baz";;
The error messages are very instructive. When you use:
let x = 2 in
...
match 2 with
| x -> "foo"
| ...
the new value x shadows the value x in previous let-bound hence the first error message. Moreover, since the new x matches everything, two below patterns of y and _ are obviously redundant.
Note that matching a constant (match 2 with) is not a good idea.