私は Rust で Peano 数の簡単な実装を書きたかったのですが、どうにかして基本を機能させることができたようです。
use self::Peano::*;
use std::ops::Add;
#[derive(Debug, PartialEq)]
enum Peano {
Zero,
Succ(Box<Peano>)
}
impl Add for Peano {
type Output = Peano;
fn add(self, other: Peano) -> Peano {
match other {
Zero => self,
Succ(x) => Succ(Box::new(self + *x))
}
}
}
fn main() {
assert_eq!(Zero + Zero, Zero);
assert_eq!(Succ(Box::new(Zero)) + Zero, Succ(Box::new(Zero)));
assert_eq!(Zero + Succ(Box::new(Zero)), Succ(Box::new(Zero)));
assert_eq!(Succ(Box::new(Zero)) + Succ(Box::new(Zero)), Succ(Box::new(Succ(Box::new(Zero)))));
assert_eq!(Succ(Box::new(Zero)) + Zero + Succ(Box::new(Zero)), Succ(Box::new(Succ(Box::new(Zero)))));
}
しかし、他の人がどのように実装したかを調べることにしたとき、誰もそれを anenum
ではなくstruct
s and PhantomData
( example 1 , example 2 ) で行うことを決定したことがわかりました。
私の実装に何か問題がありますか?これは、Zero
andSucc
がenum
バリアントであり、真の型ではないためですか (したがって、私の実装は実際の型演算ではありません)? それとも、実装を拡張した場合に発生する問題のために、これを「主流」の方法で行うことが望ましいですか?
編集: sを使用してペアノ数を実装する際の私の苦労は、ここstruct
で見ることができます。