Haskell Rust中具有超性状的有界性状参数
我对Haskell和Rust都是新手,我正在尝试将Haskell代码翻译成Rust,以便比较支持泛型的特性。不过,我似乎需要语法方面的帮助,或者需要Rust中的一些基本概念 我在Haskell中有以下代码:Haskell Rust中具有超性状的有界性状参数,haskell,generics,rust,typeclass,traits,Haskell,Generics,Rust,Typeclass,Traits,我对Haskell和Rust都是新手,我正在尝试将Haskell代码翻译成Rust,以便比较支持泛型的特性。不过,我似乎需要语法方面的帮助,或者需要Rust中的一些基本概念 我在Haskell中有以下代码: 类有一个空的 空的::a isEmpty::a->Bool 类Hashable a where 哈希::a->Int 类(HasEmpty x,可散列(元素x)) =>哈希集x,其中 类型元素x 大小::x->Int 最重要的部分是在底部,我们定义了一个名为Hashset的类型类,它接受一
类有一个空的
空的::a
isEmpty::a->Bool
类Hashable a where
哈希::a->Int
类(HasEmpty x,可散列(元素x))
=>哈希集x,其中
类型元素x
大小::x->Int
最重要的部分是在底部,我们定义了一个名为Hashset
的类型类,它接受一个参数x
,子类hassempty
。type类的主体定义了一个关联的类型,该类型必须是可散列的,以及一个关联的方法size
我怎么能在生锈的地方做同样的事情呢?以下是我到目前为止所写的内容:
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;
}
但是,有可能同时约束关联的类型和使用超级特征吗?也许我问错了问题
是否可以同时约束关联的类型和使用supertrait
当然,我不知道你为什么不把这两种语法结合起来:
trait Hashset<E>: HasEmpty
where E: Hashable
{
fn size(&self) -> i32;
}
.您对
空的定义更像Haskell中的a->()
。最好是fn empty()->Self代码>。我感觉你不恰当地使用了Haskell的类。类型类与OO类不同;它们更像是接口。除非您需要对Hashset
的各种不同实现进行抽象,否则我只需要定义一个简单的旧类型:datahashset a=…
trait Hashset<E>: HasEmpty
where E: Hashable
{
fn size(&self) -> i32;
}
trait Hashset: HasEmpty {
type E: Hashable;
fn size(&self) -> i32;
}