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 = ...' –