En primer lugar, esta pregunta no es 100% específica de Haskell, no dude en comentar sobre el diseño general de tipos de clases, interfaces y tipos.¿Por qué Haskell no llega a inferir las clases de tipos de datos en las firmas de funciones?
estoy leyendo LYAH - creating types and typeclasses El siguiente es el paso que estoy en busca de más información en:
Data (Ord k) => Map k v = ...
Sin embargo, es una convención muy fuerte en Haskell nunca añadir clase de tipos limitaciones en declaraciones de datos. ¿Por qué? Bueno, porque no nos beneficiamos mucho, pero terminamos escribiendo más restricciones de clase , incluso cuando no las necesitamos . Si ponemos o no ponemos la restricción Ord k en la declaración de datos para Map k v, vamos a tener que poner la restricción en funciones que asumen que las claves en un mapa pueden ser ordenadas. Pero si no ponemos la restricción en la declaración de datos, no tenemos que poner (Ord k) => en el tipo declaraciones de funciones que no importa si las claves pueden ser ordenadas o no. Un ejemplo de tal función es toList, que solo toma una asignación y la convierte en una lista asociativa . Su tipo de firma es toList :: Map k a -> [(k, a)]. Si Map kv tenía una restricción de tipo en su declaración de datos , el tipo para toList debería ser toList :: (Ord k) => Map ka -> [(k, a)], aunque la función no hace ninguna comparación de las claves por orden.
Esto, al principio, parece lógico, pero ¿no hay una ventaja al tener la clase de tipo adjunta al tipo? Si la clase de tipo es el comportamiento del tipo, ¿por qué debería definirse el comportamiento mediante el uso del tipo (a través de funciones) y no el tipo en sí? Supongo que hay alguna meta-programación que podría hacer uso de ella, y sin duda es una documentación de código descriptiva y agradable. Por el contrario, ¿sería esta una buena idea en otros idiomas? ¿Sería ideal especificar la interfaz a la que el objeto debería ajustarse en el método, de modo que si el que llama no utiliza el método, el objeto no tiene que ajustarse a la interfaz? Además, ¿por qué Haskell no puede inferir que una función que utiliza el tipo Foo
, tiene que obtener las restricciones de clase de tipo identificadas en la declaración del tipo Foo
? ¿Hay un pragma para habilitar esto?
La primera vez que lo leí, evocó un "eso es una respuesta de pirateo (o solución alternativa)". En la segunda lectura con un pensamiento, sonó inteligente. En la tercera lectura, dibujando una comparación con el mundo de OO, sonaba como un hack nuevamente.
Así que aquí estoy.
Soy bastante nuevo en Haskell, una breve explicación de lo que es una GADT habría sido útil (o enlace). –
He vuelto a trabajar esa sección un poco, y he agregado un enlace a la documentación de GHC para GADT. Si alguien más quiere analizar las explicaciones de lo que son GADTs, ¡sería bienvenido! – mithrandi