1. ホーム
  2. java

[解決済み] Java の Interface と Haskell の type class: 違いと類似点?

2022-07-26 07:32:34

質問

Haskellを勉強しているときに、Haskellには 型クラス これはHaskellに由来する偉大な発明であるはずだ。

しかし 型クラスに関する Wikipedia のページ :

プログラマは、関数や定数の名前とそれぞれの型を指定することで、型クラスを定義します。 定数名とそれぞれの型を指定することで、型クラスを定義します。 を指定することで定義します。

というのは、どちらかというと Java のインターフェイス に近いと思います(引用 ウィキペディアのインターフェース(Java)のページ ):

Javaプログラミング言語におけるインターフェースは、抽象的な型です。 クラスが実装しなければならない(一般的な意味での)インターフェースを指定するために使用されます。 を指定するために使われる抽象的な型です。

この2つはかなり似ています。型クラスは型の振る舞いを制限し、インターフェースはクラスの振る舞いを制限します。

Haskellのtype classとJavaのinterfaceの違いや共通点、もしかしたら根本的に違うのでしょうか。

EDITです。 気がついたのは は、haskell.orgでさえも類似していると認めています。 . もし似ているのであれば、なぜtype classはそんなに誇大に扱われるのでしょうか?

MORE EDITです。 うわー、たくさんの素晴らしい回答がありますね どれがベストなのかは、コミュニティの皆さんに決めていただくしかないでしょうね。しかし、回答を読んでいると、どれも単に次のように言っているように見えます。 型クラスができることはたくさんあるが、インターフェイスはできないか、ジェネリックに対処しなければならない"。 . という感じなのですが、どうなんでしょうか? 型クラスができないことで、インターフェースができることはありますか? また,Wikipedia によると,型クラスは 1989 年の論文 *"How to make ad-hoc polymorphism less ad hoc" で発明されたそうですが,Haskell はまだ揺籃期,Java プロジェクトは 1991 年に始まり,1995 年に初めて発表されたそうです.そこで 型クラスがインターフェースに似ているのではなく、逆にインターフェースが型クラスに影響されたのかも? これをサポートまたは反証する文書/論文はありますか?すべての回答、ありがとうございました。

すべての入力に感謝します!

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

インターフェースは、型クラスのようなものだと言えるでしょう SomeInterface t のようなもので、すべての値が t -> whatever (ここで whatever を含まない t ). これは、Javaや類似の言語の継承関係では、呼び出されるメソッドは呼び出されるオブジェクトの種類に依存し、それ以外のものには依存しないからです。

のようなものを作るのは本当に難しいということです。 add :: t -> t -> t というのは、メソッドの引数の型と戻り値の型が呼び出されたオブジェクトの型(つまり "self")と同じであることをインターフェースで指定する方法がないためです。ジェネリックでは、オブジェクト自身と同じ型であることが期待されるジェネリックパラメータを持つインターフェースを作ることで、これを偽造する方法があります。 Comparable<T> がそうであるように Foo implements Comparable<Foo> を使うように compareTo(T otherobject) のようなタイプは t -> t -> Ordering . しかし、これでもプログラマはこのルールに従わなければなりませんし、このインターフェースを使う関数を作ろうとすると、再帰的な汎用型パラメータを持たなければならないので、頭痛の種になります。

また、以下のようなものはありません。 empty :: t というのも、ここでは関数を呼び出していないので、メソッドではありません。