Can't use quotations ([| ... |]) insides declaration splices
Normal Template Haskell allows many levels of splicing and quotations:
> runQ [| (const $([|"Int"|])) |]
AppE (VarE GHC.Base.const) (LitE (StringL "Int"))
And TH can parse declarations easily:
> runQ [d| type T = Int|]
[TySynD T [] (ConT GHC.Base.Int)]
But splicing inside a declaration gives a syntax error:
> runQ [d| type T = $([t|Int|])|]
parse error on input `$('
Another example. Bulat Ziganshin defines the cnst function (http://www.haskell.org/bz/th3.htm) as:
cnst 0 str = [| str |]
cnst n str = [| \_ -> $(cnst (n-1) str) |]
Which evaluates to a function that takes n arguments and returns the string given. It would make sense that a function to define a data constructor which takes n arguments could be written similarly:
dataCnst n = [d|data D = D $(dataCnst' n)|]
dataCnst' n = [t|Int|] ++ dataCnst' (n - 1)
Finally, a function that makes a data type which varies the field type based on an argument:
dataVar n = [d|data D = D $(dataVar' n)|]
dataVar' "Int" = ''Int
dataVar' "String" = ''String
etc.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 6.8.2 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Template Haskell |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |