struct
を使用してPeano数値の適切な実装を構築しようとしましたが、私のジェネリックスのゲームはまだ十分ではないようです。私はジェネリックスのドキュメントを読んでsomeStackOverflowquestionsですが、私のケースに合っていません。一般的な構造体の列挙
私はPeano
特性とZero
とSucc
種類の導入:私がしたかった最初に
impl Peano for Zero {}
impl<T> Peano for Succ<T> where T: Peano {}
:
trait Peano {}
struct Zero;
struct Succ<T: Peano>(T);
を、両方のタイプは、両方の上に抽象化することができるようにするためのPeano
形質を実装Peano
の場合std::ops::Add
を実装していましたが、間違ったことをすごくやっていることがすぐわかりましたので、より簡単なものから始めることにしました。
trait Enumerate<T: Peano> {
fn succ(&self) -> Succ<T>;
fn pred(&self) -> Option<T>;
}
impl<T> Enumerate<T> for Zero where T: Peano {
fn succ(&self) -> Succ<T> { Succ(*self) } // mismatched types: Zero instead of T
fn pred(&self) -> Option<T> { None }
}
impl<T> Enumerate<T> for Succ<T> where T: Peano {
fn succ(&self) -> Succ<T> { Succ(*self) } // mismatched types: Succ<T> instead of T
fn pred(&self) -> Option<T> { Some(self.0) }
}
私は何が欠けていますか?私は結果をボクシングで実験したが(できるだけ避けたければ)、エラーはちょうどmismatched types: Box<Succ<T>> instead of Box<Peano>
に変更されたので、これが役に立つとは思えない。以下
全コード:
trait Peano {}
#[derive(Debug, Clone, Copy, PartialEq)]
struct Zero;
#[derive(Debug, Clone, Copy, PartialEq)]
struct Succ<T: Peano>(T);
impl Peano for Zero {}
impl<T> Peano for Succ<T> where T: Peano {}
trait Enumerate<T: Peano> {
fn succ(&self) -> Succ<T>;
fn pred(&self) -> Option<T>;
}
impl<T> Enumerate<T> for Zero where T: Peano {
fn succ(&self) -> Succ<T> { Succ(*self) }
fn pred(&self) -> Option<T> { None }
}
impl<T> Enumerate<T> for Succ<T> where T: Peano {
fn succ(&self) -> Succ<T> { Succ(*self) }
fn pred(&self) -> Option<T> { Some(self.0) }
}
感謝のように働いた、ありがとう! – ljedrz
そして、タイプレベルの計算に関する追加情報をありがとう - 私のtrait-fooは多く改良されました。 – ljedrz
@ ljedrz:タイプ・レベルの計算に深く入りたいのであれば、[typenum](https://crates.io/crates/typenum)の箱に興味があるかもしれないことに注意したい。 –