2011-09-20 14 views
6

El TemplateHaskell citando documentos dos comillas ('') como la manera de obtener el nombre de un tipo:plantilla de tipo citando Haskell problemas

> ''String 
GHC.Base.String 

Esto funciona bien para este tipo de (nombre). Sin embargo, no puedo encontrar la manera de que funcione bien, por ej. Maybe String:

> ''Maybe String -- interprets String as a data constructor 
> ''Maybe ''String -- wants to apply ''String to the Name type 

Sé que puedo solucionar mediante el uso de [t| Maybe String |], pero esto es a continuación en la mónada Q, y requiere escribir los cambios, y creo que no es escribir sido comprobado por el momento respectivo, sólo cuando empalmado en.

También puedo solucionar el problema definiendo primero un alias tipo, type MaybeString = Maybe String, y luego usando ''MaybeString, pero esto también es engorroso.

Cualquier forma de obtener directamente lo que quiero simplemente mediante la cotización ''?

Respuesta

6

'' se utiliza para citar nombres, no tipos. Maybe es un nombre, Maybe String no lo es. Por lo tanto, no es demasiado sorprendente que tenga que darle un nombre a su tipo definiendo un alias de tipo, antes de que pueda citar ese nombre.

[t| |] por otro lado, cotizaciones tipos. Tenga en cuenta la diferencia aquí.

Prelude> :t ''String 
''String :: Language.Haskell.TH.Syntax.Name 
Prelude> :t [t| String |] 
[t| String |] 
    :: Language.Haskell.TH.Syntax.Q Language.Haskell.TH.Syntax.Type 

así que me temo que no se puede utilizar '' por lo que estamos tratando de hacer.

+0

Gracias, entonces yo supongo que tengo que usar ya sea quasiquoting o encontrar otra solución para no tener que añadir [l | |] en todas partes ... – iustin

4

creo que lo que estás buscando es:

ConT ''Maybe `AppT` ConT ''String 
+0

De hecho, eso funciona, pero está en cruz con mi propósito de tratar de encontrar una manera simple de permitir que (otras personas) escriban tal construcción. Gracias en cualquier caso! – iustin

+0

Tenemos esta situación en unos pocos lugares en Yesod. Creo que el resultado que obtuve fue solo analizar una cadena, que funciona bastante bien la mayor parte del tiempo. __Editar__ Supongo que para su caso de uso la [t | ... |] probablemente sea mejor de todos modos, no importa. –

+0

Sí, pensé en analizar la cadena también (me gusta cómo se declara la base de datos persistente, por ejemplo). Sin embargo, no ayudaría mucho en mi caso de todos modos. Tal vez encuentre una solución mejor más tarde, por ahora puedo manejar con [t | ... |] :) – iustin