No creo entender las clases de tipos. Leí en alguna parte que pensar que las clases de tipos son "interfaces" (de OO) que implementa un tipo es incorrecto y engañoso. El problema es que tengo problemas para verlos como algo diferente y cómo eso está mal.
Por ejemplo, si tengo una clase de tipo (en sintaxis de Haskell)
class Functor f where
fmap :: (a -> b) -> f a -> f b
¿Cómo es eso diferente de la interfaz [1] (en la sintaxis de Java)
interface Functor<A> {
<B> Functor<B> fmap(Function<B, A> fn)
}
interface Function<Return, Argument> {
Return apply(Argument arg);
}
Una posible diferencia que se me ocurre es que la implementación de la clase de tipo utilizada en una determinada invocación no se especifica sino que se determina desde el entorno, por ejemplo, examinando los módulos disponibles para una implementación para este tipo. Parece ser un artefacto de implementación que podría abordarse en un lenguaje OO; como el compilador (o tiempo de ejecución) podría buscar un wrapper / extender / monkey-patcher que exponga la interfaz necesaria en el tipo.
¿Qué me estoy perdiendo?
[1] Tenga en cuenta que el f a
argumento se ha eliminado fmap
ya que dado que es un lenguaje OO, estaría llamando a este método en un objeto. Esta interfaz asume que el f a
argumento ha sido arreglado.