2011-03-18 7 views
6

Digamos que tengo un tipo MyType definido en el módulo My.Module. Quiero tener la cadena "My.Module.MyType" (o algo así). Si solo escribo el String directamente, es posible que tenga un error tipográfico, y si el módulo o el nombre del tipo cambian, me gustaría saberlo en tiempo de compilación.Poner en la cadena de tipo de nombre en Haskell

Ah, parece que puede haber confusión sobre lo que estoy preguntando. Por favor mira la pregunta cuidadosamente. Teniendo en cuenta el código:

module My.Module 
type MyType = Int 
data MyType2 = MyConstructor2 Int 
main = do 
    putStrLn $ theMagic MyType 
    putStrLn $ theMagic MyType2 

La salida que quiero es:

My.Module.MyType 
My.Module.MyType2 

Busco el nombre del tipo, no la definición de tipo. typeOf mostraría Int y tal, eso no es lo que quiero.

+0

¿Para qué quieres utilizar este String? Su programa debería darle errores de compilación si usa un nombre de tipo incorrecto en su código. –

+0

Quiero una cadena del nombre tipo, no el tipo en sí. Se usa para mostrar el nombre del tipo y usarlo para hacer coincidir nombres de tipos y demás. – mentics

Respuesta

8

En resumen, la respuesta es permitir Haskell plantilla y utilizar 'y ''

{-# LANGUAGE TemplateHaskell #-} 
main = do 
    putStrLn $ show 'read 

Si el tipo de deriva Typeable (que GHC puede hacer automáticamente) a continuación, puedes llamar typeOf de Data.Typeable para obtener una representación visible.

Si desea obtener tipos de ciertas funciones polimórficas, el paquete polytypeable en Hackage permite que lo haga: http://hackage.haskell.org/packages/archive/polytypeable/0.1.0.0/doc/html/Data-PolyTypeable.html

Esta es una especie de loco nivel cosa de tipo escrito por Oleg y empaquetado por Lennart, la mente tú. Y tiene .. peculiaridades. Lo más evidente es que no le puede dar (ni puedo imaginar cómo podría algo, francamente) contextos de restricciones de clase. Entonces se mostrará un tipo de a -> String en lugar de forall a. Show a => a -> String.

Si necesita más que eso, y está satisfecho con hacer ciertas cosas solo en tiempo de compilación, entonces usar template haskell para extraer información de tipo directamente de ghc es el único camino a seguir. Consulte reify y Info en particular: http://hackage.haskell.org/packages/archive/template-haskell/2.5.0.0/doc/html/Language-Haskell-TH.html

+0

La sección 7.5.3 del manual de GH documenta esto: http://www.haskell.org/ghc/docs/latest/html/users_guide/deriving.html#deriving-typeable –

+0

@taotree. ¿Cuál es el tipo de cadena de tipo polimórfico? ¿Te refieres a las firmas vis a vis function? ¿Entonces puedes obtener 'typeStr id = a -> a'? – sclv

+0

Pido disculpas por la confusión. Intenté reiterar la pregunta para enfatizar lo que intento obtener. typeOf no es lo que quiero. Quiero el nombre completo, no la definición de tipo. – mentics

0

Estándar Haskell no es compatible con esto para los nombres de tipo; solo para nombres de funtores con deriving Show. Es posible que pueda obtener nombres de tipos como cadenas usando Template Haskell.

+0

Sí, supongo que puede ser necesaria la plantilla haskell. – mentics

1

No puede definir la función Mágica (ya que necesitaría un argumento de tipo), pero puede acercarse.

import Data.Typeable 
... 
putStrLn $ show $ typeOf (undefined :: MyType) 
+0

+1 para typeOf (undefined :: MyType) – KA1

Cuestiones relacionadas