1. ホーム
  2. haskell

[解決済み] RustのtraitとHaskellのtypeclassの違いは何ですか?

2022-04-15 11:54:26

質問

特徴 と少なくとも表面的には似ているように見えますが、Rust では 型クラス しかし、両者にはいくつかの違いがあると書かれているのを見たことがあります。具体的にどのような違いがあるのか気になりました。

どのように解決するのですか?

基本的なレベルでは、それほど大きな違いはありませんが、やはりありますね。

Haskell は型クラスで定義された関数や値を「メソッド」として記述するが、これは traits が包含するオブジェクトに OOP メソッドを記述するのと同じである。しかし、Haskell はこれらを異なる方法で扱い、OOP のようにオブジェクトに固定するのではなく、個々の値として扱う。これが、表面的な違いとして最も明らかな点です。

Rustがしばらくの間できなかったことは 高次の型付けされた形質 のような、悪名高い FunctorMonad 型クラスです。

つまり、Rustのtraitは「具象型」と呼ばれるもの、つまり一般的な引数を持たないものしか記述できないのです。Haskell は最初から高階の型クラスを作って,高階の関数が他の関数を使うのと同じように,型を使うことができる.Rust では一時期、このようなことはできなかった。 関連項目 が実装されたことで、このような特徴が当たり前になり、イディオムになりました。

つまり、拡張性を無視すれば、両者はまったく同じではなく、それぞれができることを近似的に実現できるのです。

また、コメントで言われているように、GHC(Haskellの主要なコンパイラ)が型クラスについて、以下のようなさらなるオプションをサポートしていることも言及されている。 マルチパラメータ (すなわち多くの型を含む) 型クラス、および 機能依存性 は、型レベルの計算を可能にする素敵なオプションであり、次のようにつながります。 タイプファミリ . 私の知る限り、RustにはfunDepsも型ファミリもありませんが、将来的にはそうなる可能性があります。

全体として、traitとtypeclassには根本的な違いがあり、それが相互作用することによって、最終的には非常によく似た振る舞いに見えるのである。


Haskell の型クラス(高位の型も含む)についての素晴らしい記事がある。 こちら また、Rust by Exampleのtraitの章もあります。 こちら