我是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,但是如何将'trait methods' 'trait methods'作为超级用途?'trait methods'?我知道这可以说:
trait Hashset: HasEmpty {
fn size(&self) -> i32;
}
但是它是否有可能约束相关类型并使用超级?也许我问的是错误的问题 .
1 回答
当然,我不确定为什么你不只是结合这两种语法:
但是,您应该知道
E
是 not 是一个关联类型,它只是一个泛型类型 . 有关详细信息,请参阅When is it appropriate to use an associated type versus a generic type? .相关类型将是: