'How does one use pattern matching to check if something is even in OCAML?
I tried:
let rec f n =
match n with
| 0 -> case0
| k -> case1
| (2*k) -> case2;;
but didn’t work…
https://discuss.ocaml.org/t/how-does-one-us-pattern-matching-to-check-if-something-is-even/4366 https://www.quora.com/unanswered/How-does-one-use-pattern-matching-to-check-if-something-is-even
Solution 1:[1]
Pattern matching is structural in OCaml. So the following code will check if the structure of the value you match is the same as k, which is always the case, and then the value is bound to k. So anything not already matching 0 matches k. Any variables in a match are always bound, never compared to an existing binding.
| k -> case1
Next you have the following but 2*k is not any structure of a value. It's an expression or it would be a type if you ignore that 2 is an integer literal.
| (2*k) -> case2
If you want to match the value of something you have to use when like
match n with
| x when x mod 2 = 0 -> even
| _ -> odd
A better match would be to simply match n % 2 against 0 and 1. Or, since this is a match with exactly 2 cases simply use
if n mod 2 = 0 then even
else odd
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Chris |
