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 |
Data.Hashable.Lifted
Contents
Description
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 #
Minimal complete definition
Nothing
Methods
liftHashWithSalt :: ( Int -> a -> Int ) -> Int -> t a -> Int Source #
Lift a hashing function through the type constructor.
Instances
class Hashable2 t where Source #
Methods
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