
| 1. would it be possible to revert to the old behavior easily, or is | doing that difficult or impossible now given the overall changes to | the Template Haskell code? I don’t think it would be difficult to recover the old behaviour, but it's not clear to me that it would be a Good Thing. A program that works today, and then does not work tomorrow because of some incidental change to the way type inference works, would not be a happy state of affairs. Perhaps if 'x' had a type annotation that would be ok. Or maybe there is something else about your intended application that makes it solidly predictable. By all means start a wiki page to sketch a design for what you think should happen, and why it should be predicable. Meanwhile, if you would care to draft the bit of user-manual material that you wish had been there, I could review it and put it in. Thanks! Simon | -----Original Message----- | From: Francesco Mazzoli [mailto:f@mazzo.li] | Sent: 13 February 2015 12:54 | To: ghc-devs@haskell.org | Cc: Simon Peyton Jones | Subject: What `reify` sees in Template Haskell | | Hi, | | I recently stumbled upon the issue of `reify` not being able to give | information about local variables, as of GHC 7.8. For example, this | won't work: | | foo x = $(do {xInfo <- reify 'x; ...}) | | The motivation for this change is described here: | <https://ghc.haskell.org/trac/ghc/wiki/TemplateHaskell/BlogPostChanges | #PartC:Reificationandtypechecking>. | | While I agree that getting the type of local variables is going to be | brittle, I also think that offering that functionality is extremely | useful in certain cases, such as in the case of the language-c-inline | library, that used this facility to avoid having to type verbose type | annotations -- see <https://github.com/mchakravarty/language-c- | inline/issues/25>. | | My two part question is: | | 1. would it be possible to revert to the old behavior easily, or is | doing that difficult or impossible now given the overall changes to | the Template Haskell code? | 2. if 1, wouldn't it make more sense to allow reifying all names if | the user really wants, maybe with a specific `unsafeReify` function or | similar? | | It should be made clear in the docs that by using `unsafeReify` the | user is relying on GHC internals (specifically the internals of type | checking). | | Also, I think that post should at least be referenced in the manual, | for lack of better documentation. This behavior is not mentioned | anywhere else. | | Thanks, | Francesco