úÎ!¡ ýstable Portability: GHCNoneHidden internal type class.  GHC.Generics-based  implementation This provides a generic " implementation for one type at a  time. If the type of the value  is asked to hash = contains values of other types, those types have to provide  : instances. This also means that recursive types can only  be used with  if a  instance has been defined  as well (see examples below). The typical usage for " is for reducing boilerplate code  when defining " instances for ordinary algebraic ? datatypes. See the code below for some simple usage examples:   {-# LANGUAGE DeriveGeneric #-}   import Data.Hashable 0 import Data.Hashable.Generic ( gHashWithSalt )  import GHC.Generics   -- simple record ' data Foo = Foo AccountId Name Address  deriving Generic   type Address = [String]  type Name = String # newtype AccountId = AccountId Int  I -- Note: Even though gHashWithSalt could be curried, we explicitly list H -- the parameters. If you don't do this, GHC will not inline the J -- definition of gHashWithSalt, and the performance will not match L -- a non-generic implementation. If you use this method, the generic J -- hashWithSalt will generate the exact same code as a hand-rolled  -- one.  instance Hashable AccountId  instance Hashable Foo where * hashWithSalt s x = gHashWithSalt s x   -- recursive list-like type # data N = Z | S N deriving Generic   instance Hashable N where * hashWithSalt s x = gHashWithSalt s x  " -- parametric and recursive type + data Bar a = Bar0 | Bar1 a | Bar2 (Bar a)  deriving Generic  / instance Hashable a => Hashable (Bar a) where * hashWithSalt s x = gHashWithSalt s x  Note: The 0 type-class showing up in the type-signature is 4 used internally and not exported on purpose. EA value with bit pattern (01)* (or 5* in hexa), for any size of Int. O It is used as data constructor distinguisher. GHC computes its value during  compilation. Blatantly stolen from hashable.        hashable-generics-1.1.6Data.Hashable.Generichashable-1.1.2.5 Data.Hashable hashWithSalthashHashable gHashWithSalt GHashable distinguishergHashWithSalt_$fGHashable:+:$fGHashable:*: $fGHashableM1 $fGHashableK1 $fGHashableU1