2

タイプで検索する機能を備えた、Haskell の HList に似たものを作成しようとしています。以下のコードでは、play.rust-lang.org バージョンrustc 0.13.0-dev (567b90ff0 2014-12-13 20:02:15 +0000)でエラーが発生します。

<anon>:35:26: 35:31 error: unable to infer enough type information to locate the impl of the trait `ContainsRel<int, _>` for the type `HCons<int, HNil>`; type annotations required
<anon>:35     let foo: &int = list.get();
                                   ^~~~~

適切な型を推測できない理由がわかりません.HNilにはContainsRel implがありません。

trait HList {}

struct HNil;
struct HCons<H, T: HList>(H, T);

impl HList for HNil {}
impl<H, T: HList> HList for HCons<H, T> {}


trait Peano {}

struct Zero;
struct Succ<N: Peano>(N);

impl Peano for Zero {}
impl<N: Peano> Peano for Succ<N> {}

trait ContainsRel<E, P: Peano> {
    fn get(&self) -> &E;
}

impl<E, L: HList> ContainsRel<E, Zero> for HCons<E, L> {
    fn get(&self) -> &E {
        &self.0
    }
}
impl<E, X, L: ContainsRel<E, P>+HList, P: Peano> ContainsRel<E, Succ<P>> for HCons<X, L> {
    fn get(&self) -> &E {
        self.1.get()
    }
}

fn main() {
    let list: HCons<uint, HCons<int, HNil>> = HCons(5u, HCons(6i, HNil));
    let foo: &int = list.get();
}
4

1 に答える 1