RE: Re: template-haskell names in 6.3

"Simon Peyton-Jones" <[email protected]>
Newsgroups gmane.comp.lang.haskell.template
Message-ID <036EAC76E7F5EC4996A3B3C3657D4116013804D7@EUR-MSG-21.europe.corp.microsoft.com>
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:[email protected]]
| 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:[email protected]]
| >| 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
| >| >
| >| >
| >
| >
| >
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.