4

私は 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ではなくstructs and PhantomData( example 1 , example 2 ) で行うことを決定したことがわかりました。

私の実装に何か問題がありますか?これは、ZeroandSuccenumバリアントであり、真の型ではないためですか (したがって、私の実装は実際の型演算ではありません)? それとも、実装を拡張した場合に発生する問題のために、これを「主流」の方法で行うことが望ましいですか?

編集: sを使用してペアノ数を実装する際の私の苦労は、ここstructで見ることができます。

4

1 に答える 1

9

ペアノ数は、プログラムの実行時に計算に使用される値のレベルにあります。i32これは、いじってみるのには問題ありませんが、2 進数のようなものの方がはるかに効率的であるため、あまり役に立ちません。

他の実装は、現在通常の数値を使用できないタイプ レベルで Peano 数値を表します。これにより、固定サイズの配列など、数値に依存する型を表現できます。その後、コンパイラが型を推論しているときに計算が行われます。

于 2016-09-03T18:48:09.703 に答える