[Haskell-cafe] Beginner's TH question
Jeff Heard
jefferson.r.heard at gmail.com
Sat Dec 20 10:59:42 EST 2008
Two things... can I add fields to records using Template Haskell, like:
data T = T { $fields, myfield :: Field, ... }
I assume the answer there is no, and then what's wrong with this? I get:
Illegal instance declaration for `UIState t'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are type *variables*,
and each type variable appears at most once in the instance head.
Use -XFlexibleInstances if you want to disable this.)
In the instance declaration for `UIState t'
In the expression:
[d|
instance UIState t where
{ setSizeY v a = setSizeY v . uist $ a
setSizeX v a = setSizeX v . uist $ a
setDrawing v a = setDrawing v . uist $ a
setKey v a = setKey v . uist $ a
.... } |]
In the definition of `deriveUIState':
deriveUIState uist t
= [d|
instance UIState t where
{ setSizeY v a = setSizeY v . uist $ a
setSizeX v a = setSizeX v . uist $ a
setDrawing v a = setDrawing v . uist $ a
.... } |]
in this module:
-# LANGUAGE TemplateHaskell #-}
module Graphics.Rendering.Thingie.TH where
import Language.Haskell.TH
import Graphics.Rendering.Thingie.UIState
import qualified Graphics.Rendering.Thingie.BasicUIState as S
deriveUIState uist t =
[d| instance UIState t where
mousePosition a = S.mousePosition . uist $ a
mouseLeftButtonDown a = S.mouseLeftButtonDown . uist $ a
mouseRightButtonDown a = S.mouseRightButtonDown . uist $ a
mouseMiddleButtonDown a = S.mouseMiddleButtonDown . uist $ a
mouseLeftButtonClicked a = S.mouseLeftButtonClicked . uist $ a
mouseRightButtonClicked a = S.mouseRightButtonClicked . uist $ a
mouseMiddleButtonClicked a = S.mouseMiddleButtonClicked . uist $ a
mouseWheel a = S.mouseWheel . uist $ a
keyCtrl a = S.keyCtrl . uist $ a
keyShift a = S.keyShift . uist $ a
keyAlt a = S.keyAlt . uist $ a
key a = S.key . uist $ a
drawing a = S.drawing . uist $ a
sizeX a = S.sizeX . uist $ a
sizeY a = S.sizeY . uist $ a
setMousePosition v a = setMousePosition v . uist $ a
setMouseLeftButtonDown v a = setMouseLeftButtonDown v . uist $ a
setMouseRightButtonDown v a = setMouseRightButtonDown v . uist $ a
setMouseMiddleButtonDown v a = setMouseMiddleButtonDown v . uist $ a
setMouseLeftButtonClicked v a = setMouseLeftButtonClicked
v . uist $ a
setMouseRightButtonClicked v a =
setMouseRightButtonClicked v . uist $ a
setMouseMiddleButtonClicked v a =
setMouseMiddleButtonClicked v . uist $ a
setMouseWheel v a = setMouseWheel v . uist $ a
setKeyCtrl v a = setKeyCtrl v . uist $ a
setKeyShift v a = setKeyShift v . uist $ a
setKeyAlt v a = setKeyAlt v . uist $ a
setKey v a = setKey v . uist $ a
setDrawing v a = setDrawing v . uist $ a
setSizeX v a = setSizeX v . uist $ a
setSizeY v a = setSizeY v . uist $ a
|]
More information about the Haskell-Cafe
mailing list