Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Rust中具有超性状的有界性状参数_Haskell_Generics_Rust_Typeclass_Traits - Fatal编程技术网

Haskell Rust中具有超性状的有界性状参数

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的类型类,它接受一

我对Haskell和Rust都是新手,我正在尝试将Haskell代码翻译成Rust,以便比较支持泛型的特性。不过,我似乎需要语法方面的帮助,或者需要Rust中的一些基本概念

我在Haskell中有以下代码:

类有一个空的
空的::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;
}