2011-03-29 14 views
13

Por lo tanto, podría lograr esto mediante el uso 'topLevelSomething y la eliminación de la última ficha después., O podría utilizar moduleName 'something pero que devuelve una vez ...¿Cómo obtener el nombre del módulo actual en Haskell

¿Existe un mayor forma directa de obtener el nombre del módulo del contexto actual?

Por lo tanto, dado el código:

module My.Module.Blah where 
test = magicHere 

Lo que pasa en ese lugar magicHere tal que la prueba = "My.Module.Blah"?

Respuesta

1

Great answers. Terminamos haciéndolo de esta manera, ya que parecía un poco más limpio.

moduleOf 'someTopLevelThingInModule 

moduleOf :: Language.Haskell.TH.Syntax.Name -> String 
moduleOf = dropLastToken . show 
dropLastToken :: String -> String 
dropLastToken = reverse . tail . dropWhile (/= '.') . reverse 
9

Me pareció que era una buena pregunta, por lo que me di cuenta de la respuesta usando la plantilla Haskell:

{-# LANGUAGE TemplateHaskell #-} 
module A.B.C where 

import Language.Haskell.TH 
import Language.Haskell.TH.Syntax 

e :: String 
e = $(fmap loc_module qLocation >>= \mod -> return (LitE (StringL mod))) 

main = print e 
+1

Tenga en cuenta que creo que este bit de Template Haskell solo funciona en tiempo de compilación, el uso de runQ en tiempo de ejecución no funcionará. –

+6

¿Con qué frecuencia funciona Template Haskell en tiempo de ejecución? –

8

Hay una manera bastante rotonda para obtener el nombre del módulo actual utilizando tipable.

module My.Module.Blah where 
import Data.Typeable 

data T = T deriving Typeable 
test = init $ init $ show $ typeOf T 
Cuestiones relacionadas