[ ghc-Bugs-1248208 ] Result type signatures and lexically scoped
type variables
SourceForge.net
noreply at sourceforge.net
Sat Jul 30 23:03:27 EDT 2005
Bugs item #1248208, was opened at 2005-07-30 20:03
Message generated for change (Tracker Item Submitted) made by Item Submitter
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=108032&aid=1248208&group_id=8032
Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Compiler (Type checker)
Group: None
Status: Open
Resolution: None
Priority: 5
Submitted By: Nobody/Anonymous (nobody)
Assigned to: Nobody/Anonymous (nobody)
Summary: Result type signatures and lexically scoped type variables
Initial Comment:
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
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=108032&aid=1248208&group_id=8032
More information about the Glasgow-haskell-bugs
mailing list