Isn't match
already such a unified expression? Especially once you extend matches with guards, it seems to me like this is a solved problem. E.g.,
if x == 1.0 then "a" else "x"
is
match x with | 1.0 -> "a" | _ -> "b"
and
if x ==
1.0 then "a"
2.0 then "b"
else "z"
is (and IMO reads much clearer this way):
match x with
| 1.0 -> "a"
| 2.0 -> "b"
| _ -> "z"
and
if xs
.isEmpty then "e"
.contains(0,0) then "n"
else "z"
is
match () with
| _ when x.isEmpty -> "e"
| _ when x.contains(0,0) then "n"
| _ -> "z"
and
if person
.age < 18 then 18
is Person("Alice", _) then person.age
is Person("Bob", let age) then age
else -1
is
match person with
| _ when person.age < 10 -> 18
| Person("Alice", _) -> person.age
| Person("bob", age) -> age
| _ -> -1
.
Finally,
if person is Person("Alice", let age) then age else -1
Would be the simple
match person with
| Person("Alice", age) -> age
| _ -> -1
Seems to me this reads more clear in general and has less magic. Plus, it's already implemented in a bunch of languages.