1
我对Haskell和Rust都陌生,并且试图将Haskell代码转换为Rust以比较支持泛型的特性。然而,看来我需要在语法或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
的重要组成部分,在这里我们定义了一个名为一种类只有一个参数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
是哈希的,但我怎么能使用它作为“继承”的HasEmpty
的“特质的方法”超级跑车?我知道这是可能的说:
trait Hashset: HasEmpty {
fn size(&self) -> i32;
}
但它是可能的约束相关的类型和使用超级?也许我在问错误的问题。
[每一个问题的问题,请](http://meta.stackexchange.com/q/39223/281829)。 – Shepmaster
你的'empty'的Rust定义更像是Haskell中的'a - >()'。最好是“空”() - >“自我”;'。 –
我有一种感觉,你不恰当地使用Haskell的类。类型类不像OO类;他们更像接口。除非你有要求抽象各种不同的'Hashset'实现,否则我只需定义一个普通的旧类型:'data Hashset a = ...' –