2016-08-18 6 views
1

私はHaskellとRustの両方が新しく、HaskellコードをRustに翻訳して、一般性をサポートする機能を比較しようとしています。しかし、私は構文やRustの基本的な概念について助けが必要なようです。Rustのsupertraitで束縛されたtraitパラメータ

私は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の「形質メソッド」「を継承する」ことができますsupertrait?

しかし、関連するタイプを制約してスーパータートを使用することはできますか?おそらく私は間違った質問をしています。

+1

[質問ごとに1つの質問、してください](http://meta.stackexchange.com/q/39223/281829)。 – Shepmaster

+1

あなたの錆の定義は、Haskellの 'a - >()'のようなものです。 'fn empty() - > Self;とするのが良いでしょう。 –

+2

あなたはハスケルのクラスを不適切に使用していると感じています。型クラスはOOクラスに似ていません。彼らはもっとインターフェースに似ています。 'Hashset'のさまざまな実装を抽象化する必要がない限り、私はちょうど古い型を定義しています:' data Hashset a = ... ' –

答えて

1

関連するタイプを制約してスーパータートを使用することは可能ですか?

あなただけの2つの構文を組み合わせてなかった理由私はわからない、わから:

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; 
} 
関連する問題