私は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つの質問、してください](http://meta.stackexchange.com/q/39223/281829)。 – Shepmaster
あなたの錆の定義は、Haskellの 'a - >()'のようなものです。 'fn empty() - > Self;とするのが良いでしょう。 –
あなたはハスケルのクラスを不適切に使用していると感じています。型クラスはOOクラスに似ていません。彼らはもっとインターフェースに似ています。 'Hashset'のさまざまな実装を抽象化する必要がない限り、私はちょうど古い型を定義しています:' data Hashset a = ... ' –