OCaml Pattern match with non-constants

ocaml, pattern-matching

Solution

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.

Problem

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" | _ -> "baz";; let y = 5 in Warning 26: unused variable y. let x = 2 in Warning 26: unused variable x. | y -> "bar" Warning 11: this match case is unused. | _ -> "baz";; Warning 11: this match case is unused. - : string = "foo" ``` Obviously, with this syntax, the `x -> "foo"` case takes everything. Is there a way to make it be equivalent to: ``` match 2 with | 2 -> "foo" | 5 -> "bar" | _ -> "baz" ``` where the values of the match expressions are determined at runtime?

Original source