[Haskell-cafe] Typeclasses and implicit parameters

Simon Peyton-Jones simonpj at microsoft.com
Thu Sep 6 05:29:12 EDT 2007


| -- Hugs allows this.  GHC rejects it on the grounds that "a" is unused
| -- on the right-hand side of the (=>).  I think this is arguably a bug
| -- in GHC.
| f3 :: (Show a, ?foo :: a) => String
| f3 = show ?foo

Hugs is right here.  GHC 6.8 accepts this too, and has done for some time; there's even a test in the test suite (tc218).


| -- GHC rejects this.  Hugs compiles it, but I can't call it as
| -- let ?foo = "Hello" in show Foo
| --
| -- Is there a good reason to disallow this?
| data Foo = Foo
|
| instance (?foo :: String) => Show Foo where
|     showsPrec _ Foo = showString ?foo . showString "Foo"

This should be illegal.  The way in which implicit parameters are bound depends on the call site of teh overloaded function.  E.g. the call site of f3 above  affects the value of ?foo.

For an instance declaration, the "call site" is unknown -- it's wherever the type checker chooses to simplify the constraint.  No implicit parameters in instance contexts!  This is documented in GHC's user manual Section 7.4.6.1
        http://www.haskell.org/ghc/docs/latest/html/users_guide/type-extensions.html#implicit-parameters

Simon


More information about the Haskell-Cafe mailing list