[Haskell-cafe] Template Haskell question

Eelco Lempsink eelco at lempsink.nl
Tue Jan 6 18:23:45 EST 2009

On 6 jan 2009, at 18:08, Jeff Heard wrote:
> Alright...  I *think* I'm nearly there, but I can't figure out how to
> derive a class instance using record accessors and updaters...  Can
> anyone help?  There are [| XXXf |] instances at the end of the module
> and they all need replaced, but I can't figure out what to replace
> them with.

> -- usage: $(deriveUIState ''MyTypeWithUIState)
> {-
> - Derive an instance of UIState from some type that has had UIState
> fields added to it.
> -}
> deriveUIState tp = do
>    return [InstanceD []
>                      (appUIState $ appType tp [])
>                      [FunD 'mousePosition              [|  
> mousePositionf |]
>                     ,FunD 'setMousePosition            [| \b a ->  
> a{ mousePositionf=b } |]

Quick guess: this doesn't typecheck?

FunD :: Name -> [Clause] -> Dec

while [| ... |] will return something of type ExpQ (which is the same  
as Q Exp).

You're indeed nearly there, but if you use the quotation brackets you  
need to write monadic code (for the Q monad) and use functions like  
clause and funD.  The tutorials on the wiki (you've probably seen  
them, http://www.haskell.org/haskellwiki/Template_Haskell) or pretty  
good and you could also look at packages at hackage for inspiration/ 
examples, e.g. http://hackage.haskell.org/packages/archive/haxr-th/3000.0.0/doc/html/src/Network-XmlRpc-THDeriveXmlRpcType.html


Eelco Lempsink

-------------- next part --------------
A non-text attachment was scrubbed...
Name: PGP.sig
Type: application/pgp-signature
Size: 194 bytes
Desc: This is a digitally signed message part
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20090107/089b99c4/PGP.bin

More information about the Haskell-Cafe mailing list