¿Se borraron los tipos en Haskell?

13

Haskell tiene una noción de "funciones genéricas" que tiene una aparente similitud con la claridad común: al no tener experiencia con Haskell ni con la claridad común, podría ser muy aproximado aquí. Esto significa que uno puede definir una facilidad genérica to_string para definir una representación de cadena para todos los tipos. Por supuesto, la instalación debe definirse en los casos especiales, pero hay una función to_string cuya firma es α → string .

¿Se borraron los tipos en Haskell, como en OCaml? En caso afirmativo, ¿en qué se diferencia la implementación de las "funciones genéricas" en Haskell de la del lisp común, donde los tipos son dinámicos y, por lo tanto, no se borran?

Entiendo que los detalles de la implementación son específicos del compilador, pero probablemente hay disposiciones comunes a muchas o todas las implementaciones.

    
pregunta user40989 09.12.2013 - 11:29

2 respuestas

16

Hasta ahora, la respuesta es engañosa.

Es necesario hacer una distinción entre el polimorfismo "paramétrico" y la "sobrecarga ad hoc". Parametric significa "se comporta de manera uniforme para todos los tipos a", mientras que "ad-hoc", lo que Simon denomina polimórfico, cambia la implementación según el tipo.

Los ejemplos de ambos son reverse :: [a] -> [a] , que es paramétrico, y show :: Show a => a -> String , que está sobrecargado "ad-hoc".

Si desea una intuición más abstracta, creo que es útil tener en cuenta las clases de verbos en lenguaje natural que "funcionan" para todos los objetos, como "poseer" o "pensar" que no suponen restricciones para el objeto. , pero "abrir" requiere que lo que estamos hablando se pueda abrir. Puedo "pensar en una puerta" y "abrir una puerta", aunque no tiene sentido, por ejemplo. 'abrir un árbol'. Para llevar aún más el ejemplo, "abrir" es "polimórfico ad hoc", ya que "abrir una ventana" y "abrir un ticket de reclamo con servicio al cliente" son dos cosas muy diferentes. Si esto parece forzado, ¡olvídalo! Funciona para mí.

Sin embargo, ambos se resuelven en tiempo de compilación y, de hecho, se "borran". Modulo varias extensiones GHC y Template Haskell, etc. Los tipos se en realidad se borran en tiempo de compilación y nunca se inspeccionan en tiempo de ejecución.

Las funciones polimórficas paramétricas se comportan de manera idéntica para todos los tipos, por lo que solo se necesita generar una parte del código, mientras que el compilador decide en el momento de la compilación qué versión de una función "clasificada como tipo" debe ejecutarse en un punto de programa en particular. Esta es también la razón por la que existe la restricción de una instancia por tipo por clase de clase y la solución alternativa "newtype" correspondiente.

La implementación se detalla en los SPJ libro de texto y Wadler y Blotts documento sobre clases de tipo .

    
respondido por el Kris 09.12.2013 - 13:16
1

advertencia: mi experiencia en CS no es muy sólida, por lo que no siempre uso el vocabulario correcto y puedo estar equivocado en algunos puntos. De todos modos, aquí está mi entendimiento:

Creo que estás confundiendo los genéricos con el polimorfismo.

Los tipos genéricos como List<Foo> se usan para describir tipos que toman otros tipos como parámetros y permiten una verificación de tipos más rica.

Una función genérica en haskell podría ser count:: List a -> Int . Acepta listas de cualquier tipo, y devuelve el número de elementos. Solo hay una implementación.

Generalmente, al definir la Lista, no puedes asumir nada sobre T. Solo puedes almacenarlo y devolverlo.

Su función to_string es una función polimórfica, lo que significa que se comportará de manera diferente en diferentes circunstancias. En haskell, esto se hace con typeclasses, que funciona como adjetivos para tipos.

Tienes una clase de tipos Show , que define una función show :: a -> String .

Cuando un tipo Foo implementa la clase de tipos Show , debe proporcionar la definición de show . Este tipo se puede usar en funciones que requieren el calificador Show (como en Show a => a -> whatever ). Haskell no puede borrar tipos, ya que esas funciones tienen que encontrar la implementación correcta de la función show .

    
respondido por el Simon 09.12.2013 - 12:24

Lea otras preguntas en las etiquetas