enum Nat { Zero, Succ(Box) } impl Nat { fn new(u: u32) -> Nat { if u == 0 { Nat::Zero } else { Nat::Succ(Box::new(Nat::new(u - 1))) } } fn dup(&self) -> Nat { if let Nat::Succ(prev) = self { Nat::Succ(Box::new(prev.dup())) } else { Nat::Zero } } fn add(&self, n: &Nat) -> Nat { if let Nat::Succ(prev) = n { Nat::Succ(Box::new(self.add(&prev))) } else { self.dup() } } fn to_u32(n: &Nat) -> u32 { if let Nat::Succ(prev) = n { 1 + Nat::to_u32(prev) } else { 0 } } } fn main() { let z = Nat::Zero; let u = Nat::new(1); let q = Nat::new(4); let c = Nat::new(100); let hundredfour = c.add(&q); println!("{}", Nat::to_u32(&z)); println!("{}", Nat::to_u32(&u)); println!("{}", Nat::to_u32(&q)); println!("{}", Nat::to_u32(&c)); println!("{}", Nat::to_u32(&hundredfour)); }