Sorry to be slow. Instead of | Language.Haskell.TH> $( reify (mkName "Maybe") >>= error . show )
say | Language.Haskell.TH> $( reify ''Maybe >>= error . show ) Which works fine. The notation ''Maybe means "the type constructor Maybe that's in scope". When you use mkName, TH builds a Language.Haskell.TH.Name which just contains the string "Maybe", and reify interprets that as a data constructor. This is really a design flaw. Perhaps a Name should contain a name-space. That would be useful here (the NameSpace would say "I'm a tycoon"). But it's *not* useful when (say) lambda-binding a local variable. Or maybe reify should take a NameSpace argument. Anyway that's the problem and a solution is to hand. But if you have a good idea for a better design, please yell. And do please update the Wiki with whatever you have learned! Simon | -----Original Message----- | From: [EMAIL PROTECTED] [mailto:haskell-cafe- | [EMAIL PROTECTED] On Behalf Of Neil Mitchell | Sent: 04 June 2007 10:46 | To: Simon Peyton-Jones | Cc: Haskell Café | Subject: Re: [Haskell-cafe] Template Haskell, information about data | constructor types | | Hi Simon, | | On 6/4/07, Simon Peyton-Jones <[EMAIL PROTECTED]> wrote: | > | Where typeApp splits a type to find its constructor, ctorTypes gets | > | the types of the fields, and dataCtors gets the constructors in a | data | > | type. Unfortunately reify doesn't seem to work on types. Is it | > | possible to do what I am after? | > | > reify takes a Name, not a Type. | | I am passing it a name, since I pattern match on the ConT: | | let (ConT c, cs) = typeApp t | TyConI dat <- reify c | | typeApp follows the AppT's to get a vector apply, so ConT is at the | very left of a chain on AppT. | | > Perhaps you mean that reify doesn't work on type constructors? | (E.g. reify ''Maybe). | > It should -- if you think it doesn't can you concoct a test case and | submit it? | | I'm not sure if I'm doing something wrong, as I haven't managed to get | it working for any type constructors. A test case: | | ghci -fth | Prelude> :m Language.Haskell.TH | Language.Haskell.TH> $( reify (mkName "Maybe") >>= error . show ) | | Results in: | | <interactive>:1:3: | `Maybe' is not in scope at a reify | In the expression: | $[splice]((reify (mkName "Maybe")) >>= (error . show)) | In the definition of `it': | it = $[splice]((reify (mkName "Maybe")) >>= (error . show)) | | <interactive>:1:3: | Exception when trying to run compile-time code: | user error (IOEnv failure) | Code: let | >>= = (>>=) Q $dMonad | $dMonad = Language.Haskell.TH.Syntax.$f20 | show = show Info $dShow | $dShow = Language.Haskell.TH.Syntax.$f60 | in | (>>=) [Info, Exp] | (reify (mkName "Maybe")) | ((.) [[Char], Q Exp, Info] (error (Q Exp)) show) | In the expression: | $[splice]((reify (mkName "Maybe")) >>= (error . show)) | In the definition of `it': | it = $[splice]((reify (mkName "Maybe")) >>= (error . show)) | | The initial error is that Maybe is not in scope at reify. Changing to | "Data.Maybe.Maybe" doesn't help, trying "String" doesn't work, | creating a module and declaring a type in there then putting that | fragment in the file doesn't work. | | Thanks | | Neil | _______________________________________________ | Haskell-Cafe mailing list | [email protected] | http://www.haskell.org/mailman/listinfo/haskell-cafe _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
