Ich glaube nicht, dass ich Typenklassen verstehe. Ich habe irgendwo gelesen, dass es falsch und irreführend ist, sich Typklassen als "Interfaces" (von OO) vorzustellen, die ein Typ implementiert. Das Problem ist, ich habe ein Problem damit, sie als etwas anderes zu sehen und wie das falsch ist.
Wenn ich zum Beispiel eine Typklasse habe (in Haskell-Syntax)
class Functor f where
fmap :: (a -> b) -> f a -> f b
Wie unterscheidet sich das von der Schnittstelle [1] (in Java-Syntax)
interface Functor<A> {
<B> Functor<B> fmap(Function<B, A> fn)
}
interface Function<Return, Argument> {
Return apply(Argument arg);
}
Ein möglicher Unterschied, den ich mir vorstellen kann, besteht darin, dass die Typklassenimplementierung, die bei einem bestimmten Aufruf verwendet wird, nicht spezifiziert, sondern aus der Umgebung bestimmt wird - beispielsweise durch Prüfen der verfügbaren Module für eine Implementierung für diesen Typ. Das scheint ein Implementierungsartefakt zu sein, das in einer OO-Sprache angesprochen werden könnte. wie der Compiler (oder die Laufzeit) nach einem Wrapper / Extender / Monkey-Patcher suchen könnte, der die erforderliche Schnittstelle für den Typ verfügbar macht.
Was vermisse ich?
[1] Beachten Sie, dass das f a
Argument entfernt wurde, fmap
da Sie diese Methode für ein Objekt aufrufen würden, da es sich um eine OO-Sprache handelt. Diese Schnittstelle setzt voraus, dass das f a
Argument behoben wurde.