[Template-haskell] Re: template-haskell names in 6.3

Simon Peyton-Jones simonpj at microsoft.com
Fri Dec 3 09:13:30 EST 2004


do you mean 
	n <- newName s
or
	let n = mkName s
?

If the former, you'll get a new decl like
	data Foo_24 = Foo_098 Foo_24
which definitely won't clash.  We discussed this, and I've implemented
it.

If the latter, you will get 
	data Foo = Foo Foo

... and then I see what you want.  You want a version of mkName that is
like giving a qualified name in Haskell.  It's dynamically scoped just
like mkName, but it obeys the usual rules for qualified names in
Haskell.

To be totally explicit, suppose I have

	foo = [| mkQualName "Foo" "baz" |]

then if I call foo thus

	wibble = \baz -> $foo

the $foo splice will expand to "Foo.baz", and that won't see the \baz;
it'll see whatever Foo.baz is in scope.

Is that what you seek?  I can see it's reasonable.  I'd need to add

	mkQualName :: String -> String -> Name

That'd mean an extra form of Name.  Currently, if you say
	'Foo.baz
you'll get a Name whose nameModule isn't necessarily Foo... it'll be the
module that baz was actually defined in.  

Simon

| -----Original Message-----
| From: Keean Schupke [mailto:k.schupke at imperial.ac.uk]
| Sent: 03 December 2004 13:09
| To: Simon Peyton-Jones
| Subject: Re: [Template-haskell] Re: template-haskell names in 6.3
| 
| Okay,
| 
|     makeDecl :: String -> DecQ
|     makeDecl s = do
|        n <- mkName s
|        dataD (cxt []) n [] [normalC n [(NotStrict,ConT n)]]
| 
| $(makeDecl "Foo")
| 
| will give:
| 
| data Foo = Foo Foo
| 
| what I want is:
| 
|     makeDecl :: String -> DecQ
|     makeDecl s = do
|        n <- mkName s
|        m <- qCurrentModule
|        n' <- mkNameG m s
|        dataD (cxt []) n [] [normalC n [(NotStrict,ConT n')]]
| 
| $(makeDecl "Foo") -- now gives:
| 
| data Foo = Foo Module.Foo
| 
| to disambiguate from OtherModule.Foo
| 
|     Keean.
| 
| Simon Peyton-Jones wrote:
| 
| >But you used newName to generate the data type, so you do have the
| >name.!
| >
| >I guess the only way to understand this is for you to give a small TH
| >program that demonstrates the problem
| >
| >| -----Original Message-----
| >| From: Keean Schupke [mailto:k.schupke at imperial.ac.uk]
| >| Sent: 03 December 2004 12:28
| >| To: Simon Peyton-Jones
| >| Subject: Re: [Template-haskell] Re: template-haskell names in 6.3
| >|
| >| Simon Peyton-Jones wrote:
| >|
| >| Lets say we want to generate a recursive datatype, where there may
| >already
| >| be a name in scope from another module... we need:
| >|
| >| data Foo a = MkFoo (Module.Foo a)
| >|
| >| but we cannot use ''Foo to get the name as foo is not in scope yet.
| >|
| >|     Keean.
| >|
| >| >now you've lost me.  Just declare the constructor at the top
level,
| >and
| >| >it'll get a global name.
| >| >
| >| >I don't see why you would ever want to make global name yourself.
In
| >| >Haskell we don't say
| >| >
| >| >	data Foo.T = ...
| >| >
| >| >we just say
| >| >
| >| >	data Foo = ...
| >| >
| >| >Simon
| >| >
| >| >
| >
| >
| >



More information about the template-haskell mailing list