2016-08-18 110 views
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; 
} 

但它是可能的约束相关的类型和使用超级?也许我在问错误的问题。

+1

[每一个问题的问题,请](http://meta.stackexchange.com/q/39223/281829)。 – Shepmaster

+1

你的'empty'的Rust定义更像是Haskell中的'a - >()'。最好是“空”() - >“自我”;'。 –

+2

我有一种感觉,你不恰当地使用Haskell的类。类型类不像OO类;他们更像接口。除非你有要求抽象各种不同的'Hashset'实现,否则我只需定义一个普通的旧类型:'data Hashset a = ...' –

回答

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; 
}