[Haskell-cafe] How is default method signatures supposed to be used together with Generics

José Pedro Magalhães jpm at cs.uu.nl
Wed Dec 12 10:23:41 CET 2012


Hi Johan,

The error message is not ideal, but it does say that adding a Generic (Foo
a)
instance might solve the problem.

I generally do not export classes like GHashable because they are closed;
users
should never need to provide more instances themselves. Also, exporting the
class
won't make the error message any better, and the solution to this error
doesn't really
involve the GHashable class...


Cheers,
Pedro

On Wed, Dec 12, 2012 at 4:28 AM, Johan Tibell <johan.tibell at gmail.com>wrote:

> Hi,
>
> I noticed that you're not required to export the types mentioned in
> the default method signature. For example, you could have:
>
>     default hashWithSalt :: (Generic a, GHashable (Rep a)) => Int -> a ->
> Int
>     hashWithSalt salt = ghashWithSalt salt . from
>
> and not export the GHashable class. However, if users try to define an
> instance of Hashable but forget to derive Generic:
>
>     data Foo a = Foo a String
>                  deriving (Eq)  -- Oops, forgot Generic here
>
>     instance (Hashable a) => Hashable (Foo a)
>
> they get a pretty bad error message:
>
> Test.hs:10:10:
>     Could not deduce (Generic (Foo a),
>                       Data.Hashable.Class.GHashable (GHC.Generics.Rep (Foo
> a)))
>       arising from a use of `Data.Hashable.Class.$gdmhashWithSalt'
>     from the context (Hashable a)
>       bound by the instance declaration at Test.hs:10:10-41
>     Possible fix:
>       add (Generic (Foo a),
>            Data.Hashable.Class.GHashable
>              (GHC.Generics.Rep (Foo a))) to the context of
>         the instance declaration
>       or add instance declarations for
>          (Generic (Foo a),
>           Data.Hashable.Class.GHashable (GHC.Generics.Rep (Foo a)))
>     In the expression: (Data.Hashable.Class.$gdmhashWithSalt)
>     In an equation for `hashWithSalt':
>         hashWithSalt = (Data.Hashable.Class.$gdmhashWithSalt)
>     In the instance declaration for `Hashable (Foo a)'
>
> Exporting GHashable would help a little bit in that users would at
> least know what this GHashable class that the error talks about is.
>
> What's best practice?
>
> -- Johan
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20121212/2893a8ca/attachment.htm>


More information about the Haskell-Cafe mailing list