Je ne pense pas comprendre les classes de types. J'ai lu quelque part que penser que les classes de type sont des "interfaces" (de OO) implémentées par un type est faux et trompeur. Le problème, c'est que j'ai du mal à les voir comme quelque chose de différent et que c'est faux.
Par exemple, si j'ai une classe de type (en syntaxe Haskell)
class Functor f where
fmap :: (a -> b) -> f a -> f b
En quoi est-ce différent de l'interface [1] (en syntaxe Java)
interface Functor<A> {
<B> Functor<B> fmap(Function<B, A> fn)
}
interface Function<Return, Argument> {
Return apply(Argument arg);
}
Une différence possible à laquelle je peux penser est que l'implémentation de la classe de type utilisée lors d'une invocation donnée n'est pas spécifiée, mais déterminée à partir de l'environnement, par exemple en examinant les modules disponibles pour une implémentation de ce type. Cela semble être un artefact de mise en œuvre qui pourrait être traité dans un langage OO; comme le compilateur (ou le moteur d’exécution) pourrait rechercher un wrapper / extender / monkey-patcher qui expose l’interface nécessaire sur le type.
Qu'est-ce que je rate?
[1] Notez que l' f a
argument a été supprimé fmap
car étant donné qu'il s'agit d'un langage OO, vous appelez cette méthode sur un objet. Cette interface suppose que l' f a
argument a été corrigé.