2011-03-29 10 views
6

Parece imposible introspeccionar las restricciones de clases de tipos en las funciones y tipos de datos, etc. Sin embargo, ghci parece hacerlo.¿Cómo: t en ghci accede a toda esa información introspectiva?

Prelude> :t show 
show :: (Show a) => a -> String 

Así que ... de alguna manera conoce la restricción de clase de tipo ya que está imprimiendo. ¿Cómo está haciendo eso?

Respuesta

10

La información se guarda en archivos de interfaz (module.hi). Para lograrlo en un programa en ejecución necesitaría encontrar y leer los archivos .hi (el paquete Hint en Hackage hace esto, creo); desde ghci lee los archivos .hi en el proceso de compilación a bytecode, tiene esa información convenientemente disponible.

Puede ver lo que hay en un archivo .hi con ghc --show-iface module.hi.

3

Los "binarios" compilados por separado son los archivos ".hi". Estos contienen toda la información de tipo para que pueda escribir el código que los utiliza, y contienen todas las definiciones de clase de tipo y todas las instancias de clase de tipo para que su código pueda usarlas o ampliarlas.

Por lo tanto, ghci compila la fuente para ".hi" y carga todos los archivos ".hi" dependientes. Esto le da un conocimiento perfecto de todos los tipos. Lo que ghci no necesita hacer es volver al origen de todos los módulos importados, solo necesita los archivos ".hi".

Cuestiones relacionadas