我想嘗試使用struct
來構建適當的Peano數字實現,但似乎我的泛型遊戲還不夠好,我可以使用一些幫助。我閱讀泛型文檔和someStackOverflowquestions,但它們不適合我的情況。枚舉通用結構
我介紹了一個Peano
特質和Zero
和Succ
類型:
trait Peano {}
struct Zero;
struct Succ<T: Peano>(T);
並實施了Peano
性狀兩種類型能夠抽象通過兩個:
impl Peano for Zero {}
impl<T> Peano for Succ<T> where 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
並且感謝關於類型級計算的額外信息 - 我的特質-foo已經提高了很多。 – ljedrz
@ljedrz:我會注意到,如果你想深入到類型級計算中,你可能會對[typenum](https://crates.io/crates/typenum)箱子感興趣。 –