koyama41
ああ、でもやっぱ Glasgow ノリなんですかね、単語のチョイスが
(言葉遣いの厳密さに目をつむって)ざっくりとした理解するには悪くないんじゃないかと思いますが...。誤った記述が正しい記述より優れているということは断じてありえないと思います。誤った記述から得られるのは誤った理解のみで、いずれ修正しないといけないので時間の無駄にしかなりません。特に、最初から間違った考えを取り込んでしまったとき、その誤りを直すコストは大きいです
型クラスとは、型の振る舞いを定義するものです。振る舞いを持つのは関数などの操作であって、「型の振る舞い」というのは意味をなしていない表現です。
オブジェクト指向におけるクラスとは概念が異なり、Interfaceや抽象クラスに相当します。近い意味合いを持っているのは確かです。
インスタンスとは、型クラスの制約を満たすように定義した型のことです。インスタンスは型ではないです。
オブジェクト指向におけるインスタンス(クラスの実体)とは概念が異なり、クラスの実装(Implement)に相当します意味合いは近いかも知れませんが、先に述べられたように、存在量化などを使わない限り同一の型で扱えないためOOPのクラスに例えるのはあまりいい考えには見えません。
条件式意味不明でした。
Eqのインスタンスは、等価性検査の型に使われ、「==」や「/=」で比較できる型を表します。繰り返しですがインスタンスは型ではありません。等価性検査の型というのもよく意味がわかりません。
Int、Bool、Charといった基本的なデータは全てEqのインスタンスとなります。それら3つはEqのインスタンスですが、それらはデータ型であってデータではないです。
Ordのインスタンスは、順序を持った型に使われ、大小の比較ができることを保証する。(<)、(<=)、(>)、(>=)の四つの比較関数は全て同一の型を持ちます。ここはおおむね正しいです。
Showのインスタンスは、文字列表現を返します。インスタンスは値を返すものではありません。
文字列表現を返すshow関数やprint関数は、Showのインスタンスです。関数はインスタンスとは異なる概念です。先の「インスタンスとは…型のことです」という記述とも矛盾しています。またprint関数はIOアクションを返します。
derivingキーワードを使えば,Haskellが型クラスの文脈での振る舞いを自動導出します。「型クラスの文脈での振る舞い」の意味がわかりませんでした。実装を導出すると言いたいのでしょうか… :thinking:
自動導出できるクラスは以下の通りです。Ixが抜けています。
インスタンスは型ではないです。というのは?確かに Monad クラスなどのインスタンスは型コンストラクタであって型ではありませんけど、 Eq クラスについてはインスタンスは型であるといっていいのではないでしょうか?