Copyright |
(c) Milan Straka 2010
(c) Johan Tibell 2011 (c) Bryan O'Sullivan 2011 2012 |
---|---|
License | BSD-3-Clause |
Maintainer | johan.tibell@gmail.com |
Stability | provisional |
Portability | portable |
Safe Haskell | Safe |
Language | Haskell2010 |
Lifting of the
Hashable
class to unary and binary type constructors.
These classes are needed to express the constraints on arguments of
types that are parameterized by type constructors. Fixed-point data
types and monad transformers are such types.
Synopsis
-
class
Hashable1
t
where
- liftHashWithSalt :: ( Int -> a -> Int ) -> Int -> t a -> Int
- class Hashable2 t where
- hashWithSalt1 :: ( Hashable1 f, Hashable a) => Int -> f a -> Int
- hashWithSalt2 :: ( Hashable2 f, Hashable a, Hashable b) => Int -> f a b -> Int
- defaultLiftHashWithSalt :: ( Hashable2 f, Hashable a) => ( Int -> b -> Int ) -> Int -> f a b -> Int
Type Classes
class Hashable1 t where Source #
Nothing
liftHashWithSalt :: ( Int -> a -> Int ) -> Int -> t a -> Int Source #
Lift a hashing function through the type constructor.
Instances
class Hashable2 t where Source #
liftHashWithSalt2 :: ( Int -> a -> Int ) -> ( Int -> b -> Int ) -> Int -> t a b -> Int Source #
Lift a hashing function through the binary type constructor.
Instances
Hashable2 Either Source # | |
Hashable2 (,) Source # | |
Defined in Data.Hashable.Class |
|
Hashable2 Map Source # |
Since: 1.3.4.0 |
Hashable a1 => Hashable2 ( (,,) a1) Source # | |
Defined in Data.Hashable.Class |
|
Hashable2 ( Const :: Type -> Type -> Type ) Source # | |
( Hashable a1, Hashable a2) => Hashable2 ( (,,,) a1 a2) Source # | |
Defined in Data.Hashable.Class |
|
( Hashable a1, Hashable a2, Hashable a3) => Hashable2 ( (,,,,) a1 a2 a3) Source # | |
Defined in Data.Hashable.Class |
|
( Hashable a1, Hashable a2, Hashable a3, Hashable a4) => Hashable2 ( (,,,,,) a1 a2 a3 a4) Source # | |
Defined in Data.Hashable.Class |
|
( Hashable a1, Hashable a2, Hashable a3, Hashable a4, Hashable a5) => Hashable2 ( (,,,,,,) a1 a2 a3 a4 a5) Source # | |
Defined in Data.Hashable.Class |
Auxiliary Functions
hashWithSalt1 :: ( Hashable1 f, Hashable a) => Int -> f a -> Int Source #
Lift the
hashWithSalt
function through the type constructor.
hashWithSalt1 = liftHashWithSalt hashWithSalt
hashWithSalt2 :: ( Hashable2 f, Hashable a, Hashable b) => Int -> f a b -> Int Source #
Lift the
hashWithSalt
function through the type constructor.
hashWithSalt2 = liftHashWithSalt2 hashWithSalt hashWithSalt
defaultLiftHashWithSalt :: ( Hashable2 f, Hashable a) => ( Int -> b -> Int ) -> Int -> f a b -> Int Source #
Lift the
hashWithSalt
function halfway through the type constructor.
This function makes a suitable default implementation of
liftHashWithSalt
,
given that the type constructor
t
in question can unify with
f a
.
Motivation
This type classes provided in this module are used to express constraints
on type constructors in a Haskell98-compatible fashion. As an example, consider
the following two types (Note that these instances are not actually provided
because
hashable
does not have
transformers
or
free
as a dependency):
newtype WriterT w m a = WriterT { runWriterT :: m (a, w) } data Free f a = Pure a | Free (f (Free f a))
The
Hashable1
instances for
WriterT
and
Free
could be written as:
instance (Hashable w, Hashable1 m) => Hashable1 (WriterT w m) where liftHashWithSalt h s (WriterT m) = liftHashWithSalt (liftHashWithSalt2 h hashWithSalt) s m instance Hashable1 f => Hashable1 (Free f) where liftHashWithSalt h = go where go s x = case x of Pure a -> h s a Free p -> liftHashWithSalt go s p
The
Hashable
instances for these types can be trivially recovered with
hashWithSalt1
:
instance (Hashable w, Hashable1 m, Hashable a) => Hashable (WriterT w m a) where hashWithSalt = hashWithSalt1 instance (Hashable1 f, Hashable a) => Hashable (Free f a) where hashWithSalt = hashWithSalt1