在Rust中使用supertrait的有界特征参数

时间:2016-08-18 22:21:54

标签: haskell generics rust typeclass traits

我是Haskell和Rust的新手,我正在尝试将Haskell代码转换为Rust,以便比较支持通用性的功能。但是,似乎我需要帮助语法或Rust中的一些基本概念。

我在Haskell中有这个代码:

class HasEmpty a where
    empty :: a
    isEmpty :: a -> Bool

class Hashable a where
    hash :: a -> Int

class (HasEmpty x, Hashable (Element x))
        => Hashset x where
    type Element x
    size :: x -> Int

重要部分位于底部,我们定义了一个名为Hashset的类型类,它采用单个参数x和子类HasEmpty。类类的主体定义了一个关联类型,它必须是Hashable,以及一个关联的方法size

我怎么能在Rust做同样的事情?这是我到目前为止所写的内容:

trait HasEmpty {
    fn empty(&self);
    fn is_empty(&self) -> bool;
}

trait Hashable {
    fn hash(&self) -> u32;
}

trait Hashset<E>
    where E: Hashable
{
    fn size(&self) -> i32;
}

这会编译并允许我说关联类型E是Hashable,但是我如何通过将它作为超级用途'继承'HasEmpty的'特征方法'?我知道这可以说:

trait Hashset: HasEmpty {
    fn size(&self) -> i32;
}

但是是否可以约束相关类型并使用supertrait?也许我问的是错误的问题。

1 个答案:

答案 0 :(得分:1)

  

是否可以约束相关类型并使用超级画面?

当然,我不确定你为什么不把这两种语法结合起来:

trait Hashset<E>: HasEmpty
    where E: Hashable
{
    fn size(&self) -> i32;
}

但是,您应该知道E 是关联类型,它只是一种通用类型。有关详细信息,请参阅When is it appropriate to use an associated type versus a generic type?

关联类型为:

trait Hashset: HasEmpty {
    type E: Hashable;
    fn size(&self) -> i32;
}