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