[解決済み] RustのtraitとHaskellのtypeclassの違いは何ですか?
質問
特徴 と少なくとも表面的には似ているように見えますが、Rust では 型クラス しかし、両者にはいくつかの違いがあると書かれているのを見たことがあります。具体的にどのような違いがあるのか気になりました。
どのように解決するのですか?
基本的なレベルでは、それほど大きな違いはありませんが、やはりありますね。
Haskell は型クラスで定義された関数や値を「メソッド」として記述するが、これは traits が包含するオブジェクトに OOP メソッドを記述するのと同じである。しかし、Haskell はこれらを異なる方法で扱い、OOP のようにオブジェクトに固定するのではなく、個々の値として扱う。これが、表面的な違いとして最も明らかな点です。
Rustがしばらくの間できなかったことは
高次の型付けされた形質
のような、悪名高い
Functor
と
Monad
型クラスです。
つまり、Rustのtraitは「具象型」と呼ばれるもの、つまり一般的な引数を持たないものしか記述できないのです。Haskell は最初から高階の型クラスを作って,高階の関数が他の関数を使うのと同じように,型を使うことができる.Rust では一時期、このようなことはできなかった。 関連項目 が実装されたことで、このような特徴が当たり前になり、イディオムになりました。
つまり、拡張性を無視すれば、両者はまったく同じではなく、それぞれができることを近似的に実現できるのです。
また、コメントで言われているように、GHC(Haskellの主要なコンパイラ)が型クラスについて、以下のようなさらなるオプションをサポートしていることも言及されている。 マルチパラメータ (すなわち多くの型を含む) 型クラス、および 機能依存性 は、型レベルの計算を可能にする素敵なオプションであり、次のようにつながります。 タイプファミリ . 私の知る限り、RustにはfunDepsも型ファミリもありませんが、将来的にはそうなる可能性があります。
全体として、traitとtypeclassには根本的な違いがあり、それが相互作用することによって、最終的には非常によく似た振る舞いに見えるのである。
Haskell の型クラス(高位の型も含む)についての素晴らしい記事がある。 こちら また、Rust by Exampleのtraitの章もあります。 こちら
関連
-
[解決済み] Haskellです。パターンでのパースエラー
-
[解決済み] Hindley-Milnerのどの部分が理解できないのでしょうか?
-
[解決済み] モナドはエンドファンクタのカテゴリではただのモノイドですが、何か問題でも?
-
[解決済み] .の違いは何ですか?(ドット)と$(ドルマーク)の違いは何ですか?
-
[解決済み] Project Eulerとの速度比較。CとPythonとErlangとHaskellの比較
-
[解決済み] Rust の `String` と `str` の違いは何ですか?
-
[解決済み] フリーモナドとは何ですか?
-
[解決済み】Template Haskellの何がそんなに悪いのか?
-
[解決済み] Haskellで副作用がモナドとしてモデル化されているのはなぜですか?
-
[解決済み] レコードの単一フィールドを割り当て、残りのフィールドはコピーするための省略記法?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン