型クラスを理解しているとは思わない。私はどこかで、型が実装する「インターフェース」(OOから)として型クラスを考えることは間違っており、誤解を招くものだと読みました。問題は、それらを異なるものとみなし、それがどのように間違っているかを見るのに問題があることです。
たとえば、(Haskell構文の)型クラスがある場合
class Functor f where
fmap :: (a -> b) -> f a -> f b
これはインターフェース[1](Java構文)とどのように違いますか
interface Functor<A> {
<B> Functor<B> fmap(Function<B, A> fn)
}
interface Function<Return, Argument> {
Return apply(Argument arg);
}
考えられる違いの1つは、特定の呼び出しで使用される型クラスの実装が指定されず、環境から決定されることです。たとえば、この型の実装で使用可能なモジュールを調べます。これは、OO言語で対処できる実装アーティファクトのようです。コンパイラー(またはランタイム)が、タイプに必要なインターフェースを公開するラッパー/エクステンダー/モンキーパッチャーをスキャンできるように。
私は何が欠けていますか?
[1] オブジェクト指向言語であるため、f a
引数が削除されていることに注意してくださいfmap
。オブジェクトでこのメソッドを呼び出すことになります。このインターフェイスは、f a
引数が修正されていることを前提としています。