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?