fn grade(score: u8) -> char {
match score {
90..=100 => 'A',
80..=89 => 'B',
70..=79 => 'C',
60..=69 => 'D',
_ => 'F',
}
}
fn classify_char(c: char) -> &'static str {
match c {
'A'..='Z' => "upper",
'a'..='z' => "lower",
'0'..='9' => "digit",
_ => "other",
}
}
fn tax(income: u32) -> f64 {
match income {
0..=10_000 => 0.10,
10_001..=40_000 => 0.12,
40_001..=85_000 => 0.22,
85_001..=163_300 => 0.24,
_ => 0.32,
}
}
fn main() {
for s in [95u8,82,74,61,45] { print!("{}->{} ", s, grade(s)); } println!();
for c in ['A','z','5','!'] { print!("{}:{} ", c, classify_char(c)); } println!();
for i in [5_000u32, 25_000, 60_000, 100_000] {
println!("income {} -> {:.0}% tax", i, tax(i)*100.0);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test] fn test_grade() { assert_eq!(grade(95),'A'); assert_eq!(grade(55),'F'); }
#[test] fn test_char_lower() { assert_eq!(classify_char('x'), "lower"); }
#[test] fn test_tax() { assert_eq!(tax(5_000), 0.10); }
}
(* Range-like matching in OCaml via guards *)
let grade n =
match n with
| n when n >= 90 -> 'A'
| n when n >= 80 -> 'B'
| n when n >= 70 -> 'C'
| n when n >= 60 -> 'D'
| _ -> 'F'
let classify_char c =
match Char.code c with
| n when n >= 65 && n <= 90 -> "upper"
| n when n >= 97 && n <= 122 -> "lower"
| n when n >= 48 && n <= 57 -> "digit"
| _ -> "other"
let () =
List.iter (fun n -> Printf.printf "%d->%c " n (grade n)) [95;82;74;61;45];
print_newline ();
List.iter (fun c -> Printf.printf "%c:%s " c (classify_char c)) ['A';'z';'5';'!']