GHC: Ticket #430: Result type signatures and lexically scoped type variables
http://ghc.haskell.org/trac/ghc/ticket/430
<pre class="wiki">Dear ghc developers,
The ghc documentation (7.4.10.) states that
"A lexically scoped type variable can be bound by:
[...] A result type signature"
However, actually trying to use them causes some
unexpected behavior:
import Data.Typeable
foo :: Typeable b => b
foo :: a = typeOf (undefined :: a) `seq` (undefined :: a)
bar :: forall b. Typeable b => b
bar :: a = typeOf (undefined :: a) `seq` (undefined :: a)
baz :: forall a. Typeable a => a
baz :: a = typeOf (undefined :: a) `seq` (undefined :: a)
All three examples give rise to basically the same
error message, namely
Inferred type is less polymorphic than expected
Quantified type variable `b' is mentioned in the
environment:
Scoped type variable `a' = b (bound at:
test135.hs:4:7)
When trying to generalise the type inferred for `foo'
Signature type: forall b. (Typeable b) => b
Type to generalise: b
In the type signature for `foo'
When generalising the type(s) for `foo'
If I understand the documentation correctly, they
should all compile. An especially interesting case is
'baz', where the 'a' from the result type annotation
seems to shadow the a from the type signature (that
doesn't happen with pattern type annotations).
Another curiosity happens if we alpha-rename foo:
qux :: Typeable a => a
qux :: a = typeOf (undefined :: a) `seq` (undefined :: a)
The error message becomes
All of the type variables in the constraint
`Typeable a' are already in scope
(at least one must be universally quantified here)
In the type signature: qux :: (Typeable a) => a
This is just my wild speculation, but does this really
mean that the 'a' in qux's signature is bound by "qux
:: a"?
ghc6.2 gives the same error messages, where of course
'bar' behaves like 'foo' and 'baz' like 'qux'.
Thanks you,
-- Thomas Jäger
</pre>en-usGHChttp://ghc.haskell.org/trac/ghc/chrome/site/ghc_logo.png
http://ghc.haskell.org/trac/ghc/ticket/430
Trac 1.2simonpjWed, 10 Aug 2005 10:30:58 GMTstatus changed
http://ghc.haskell.org/trac/ghc/ticket/430#comment:1
http://ghc.haskell.org/trac/ghc/ticket/430#comment:1
<ul>
<li><strong>status</strong>
changed from <em>assigned</em> to <em>closed</em>
</li>
</ul>
<pre class="wiki">Logged In: YES
user_id=50165
This isn't a bug; read Section 7.4.10.5 carefully, esp the stuff
about 'rev'.
In all your examples, your type variable is taking as a pattern
signature, not a result signature, as the manual explains.
This might not be what you expect, but it obeys the rule that
the scope of the type variable is the same as the scope of the
variable in the pattern.
</pre>
Ticket