Thanks for a fine bug report.

Really there are two bugs

Bug 1: without -fglasgow-exts, this program should be rejected,
since Haskell 98 doesn't allow records with polymorphic fields.
Your record is really
        data Record = R { blub :: forall a. Foo a => a -> [a] }

Bug 2: Assuming -fglasgow-exts, what type should blub have?
The "obvious" type is:

        blub :: Record -> forall a. Foo a => a -> [a]

but GHC doesn't expect functions to have types with a forall
after a function arrow.  This is isomorphic to

        blub :: forall a. Record -> Foo a => a -> [a]

and that is in fact the type that GHC gives it.  But having
given it that type, GHC trips up because it doesn't expect
to see types with a '=>' that isn't preceded by a 'forall'.
Hence the strange error message. 

If we wrote the records selector in plain Haskell thus:

        foo (R x) = x

then GHC would infer the type

        foo :: forall a. Foo a => Record -> a -> [a]

and that would be the right type to give blub.  I'll fix this in the HEAD.
And I hope we'll back-patch the fix to 4.08.2

Thanks again for an excellent report.

Simon

| -----Original Message-----
| From: Volker Stolz [mailto:[EMAIL PROTECTED]]
| Sent: 13 December 2000 08:29
| To: [EMAIL PROTECTED]
| Subject: Type checker too lazy
| 
| 
| Consider the following record (yes, I know, we all hate records but
| I use them frequently for read-only data):
| 
| > import IO
| > 
| > class Foo a where
| >   bar :: a -> [a]
| > 
| > instance Foo Int where
| >   bar x = replicate x x
| > 
| > data Record = R {
| >      blub :: Foo a => a -> [a]
| >     }
| > 
| > main = do
| >   let r = R {blub = bar}
| > 
| >   print (bar (3::Int)) -- works!
| >   --print ((blub r) (3::Int)) -- doesn?t compile!
| 
| As long as I don?t try to use "r", everything works fine. 
| Using the latter
| print-statement, ghc yields
| 
| classTest.lhs:14:
|     Couldn't match `Int' against `{Foo a}'
|         Expected type: Int
|         Inferred type: {Foo a}
|     In an expression with a type signature: 3 :: Int
| 
| Hugs (Feb?00) is much more eager and wouldn?t even load the 
| working case:
| ERROR "classTest.lhs" (line 10): Undefined type variable "a".
| 
| Shouldn?t ghc reject the record-declaration altogether like 
| Hugs? Why can?t
| I use the record like I?m doing in the first place?
| -- 
| \usepackage[latin1]{inputenc}!
| Volker Stolz * [EMAIL PROTECTED] * PGP + S/MIME
| 
| _______________________________________________
| Glasgow-haskell-bugs mailing list
| [EMAIL PROTECTED]
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs
| 

_______________________________________________
Glasgow-haskell-bugs mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to