[解決済み] Java の Interface と Haskell の type class: 違いと類似点?
質問
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
というのも、ここでは関数を呼び出していないので、メソッドではありません。
関連
-
Eclipse問題 アクセス制限。タイプ 'SunJCE' が API でないことを解決し、/jdk ディレクトリにある /jre と jre の違いについて理解を深める。
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] いつ使うか。Java 8+のインターフェイスのデフォルトメソッドと、抽象的なメソッドの比較
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
-
[解決済み] Typescript によるインターフェース型チェック
-
[解決済み] C#4 インターフェースで定義されたオプションパラメータは、なぜ実装クラスで強制されないのですか?
-
[解決済み】「インターフェースに合わせたプログラム」とはどういう意味ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
-bash: java: コマンドが見つからない 解決方法
-
java.sql.SQLException: 結果セットの開始前
-
java send https request prompt java.security.cert.について。
-
Server Tomcat v9.0 Server at localhost の起動に失敗しました。
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
htmlとwordの相互変換の実装(画像あり)
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。