3
型クラスとオブジェクトインターフェイス
型クラスを理解しているとは思わない。私はどこかで、型が実装する「インターフェース」(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引数が修正されていることを前提としています。