我是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?也许我问的是错误的问题。
答案 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;
}