diff --git a/src/count.rs b/src/count.rs new file mode 100644 index 0000000..c1e6db6 --- /dev/null +++ b/src/count.rs @@ -0,0 +1,42 @@ +use std::marker::PhantomData; + +trait Nat { + fn int() -> i32; +} + +struct Z; + +impl Nat for Z { + fn int() -> i32 { + 0 + } +} + +struct S(PhantomData); + +impl Nat for S { + fn int() -> i32 { + N::int() + 1 + } +} + + +trait Count: Nat { + fn count() -> String; +} + +impl Count for Z { + fn count() -> String { + "0".to_string() + } +} + +impl Count for S { + fn count() -> String { + format!("{} {}", N::count(), Self::int()) + } +} + +pub fn count() { + println!("{}", >> as Count>::count()); +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index e7a11a9..a47ddb2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +mod count; + fn main() { - println!("Hello, world!"); + count::count(); }