The Graph data type is a deep embedding of the core graph construction primitives empty, vertex, overlay and connect. We define a Num instance as a convenient notation for working with graphs:
0 == vertex 0
1 + 2 == overlay (vertex 1) (vertex 2)
1 * 2 == connect (vertex 1) (vertex 2)
1 + 2 * 3 == overlay (vertex 1) (connect (vertex 2) (vertex 3))
1 * (2 + 3) == connect (vertex 1) (overlay (vertex 2) (vertex 3))
Note: the Num instance does not satisfy several "customary laws" of Num,
which dictate that fromInteger 0 and fromInteger 1 should act as
additive and multiplicative identities, and negate as additive inverse.
Nevertheless, overloading fromInteger, + and * is very convenient when
working with algebraic graphs; we hope that in future Haskell's Prelude will
provide a more fine-grained class hierarchy for algebraic structures, which we
would be able to utilise without violating any laws.
The Eq instance is currently implemented using the AdjacencyMap as the canonical graph representation and satisfies all axioms of algebraic graphs:
overlay is commutative and associative:
x + y == y + x x + (y + z) == (x + y) + zconnect is associative and has empty as the identity:
x * empty == x empty * x == x x * (y * z) == (x * y) * zconnect distributes over overlay:
x * (y + z) == x * y + x * z (x + y) * z == x * z + y * zconnect can be decomposed:
x * y * z == x * y + x * z + y * z
The following useful theorems can be proved from the above set of axioms.
overlay has empty as the identity and is idempotent:
x + empty == x empty + x == x x + x == xAbsorption and saturation of connect:
x * y + x + y == x * y x * x * x == x * x
When specifying the time and memory complexity of graph algorithms, n will
denote the number of vertices in the graph, m will denote the number of
edges in the graph, and s will denote the size of the corresponding
Graph expression. For example, if g is a Graph then n, m and s can
be computed as follows:
n == vertexCount g
m == edgeCount g
s == size gNote that size counts all leaves of the expression:
vertexCount empty == 0
size empty == 1
vertexCount (vertex x) == 1
size (vertex x) == 1
vertexCount (empty + empty) == 0
size (empty + empty) == 2Converting a Graph to the corresponding AdjacencyMap takes O(s + m * log(m)) time and O(s + m) memory. This is also the complexity of the graph equality test, because it is currently implemented by converting graph expressions to canonical representations based on adjacency maps.
The total order on graphs is defined using size-lexicographic comparison:
Compare the number of vertices. In case of a tie, continue.
Compare the sets of vertices. In case of a tie, continue.
Compare the number of edges. In case of a tie, continue.
Compare the sets of edges.
Here are a few examples:
vertex 1 < vertex 2
vertex 3 < edge 1 2
vertex 1 < edge 1 1
edge 1 1 < edge 1 2
edge 1 2 < edge 1 1 + edge 2 2
edge 1 2 < edge 1 3Note that the resulting order refines the isSubgraphOf relation and is compatible with overlay and connect operations:
isSubgraphOf x y ==> x <= yempty <= x
x <= x + y
x + y <= x * yDeforestation (fusion) is implemented for some functions in this module. This means that when a function tagged as a "good producer" is composed with a function tagged as a "good consumer", the intermediate structure will not be built.
Instances20Monad, Functor, Applicative, Alternative, MonadPlus, Eq, …
Monad GraphDefined in algebraic-graphs-0.8 · Algebra.Graph>>= is a good consumer and producer.
Functor GraphDefined in algebraic-graphs-0.8 · Algebra.Graphfmap is a good consumer and producer.
Applicative GraphDefined in algebraic-graphs-0.8 · Algebra.Graph<*> is a good consumer of its first argument and a good producer.
Alternative GraphDefined in algebraic-graphs-0.8 · Algebra.GraphMonadPlus GraphDefined in algebraic-graphs-0.8 · Algebra.GraphGraph GraphDefined in algebraic-graphs-0.8 · Algebra.Graph.HigherKinded.ClassOrd a => Eq (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph== is a good consumer of both arguments.
Num a => Num (Graph a)Defined in algebraic-graphs-0.8 · Algebra.GraphNote: this does not satisfy the usual ring laws; see Graph for more details.
Ord a => Ord (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graphcompare is a good consumer of both arguments.
Show a => Show (Graph a)Defined in algebraic-graphs-0.8 · Algebra.GraphIsString a => IsString (Graph a)Defined in algebraic-graphs-0.8 · Algebra.GraphGeneric (Graph a)Defined in algebraic-graphs-0.8 · Algebra.GraphSemigroup (Graph a)Defined in algebraic-graphs-0.8 · Algebra.GraphDefined via overlay.
Monoid (Graph a)Defined in algebraic-graphs-0.8 · Algebra.GraphNFData a => NFData (Graph a)Defined in algebraic-graphs-0.8 · Algebra.GraphGraph (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph.ClassOrd a => ToGraph (Graph a)Defined in algebraic-graphs-0.8 · Algebra.Graph.ToGraphSee Algebra.Graph.
type Rep (Graph a) = D1 ('MetaDataDefined in algebraic-graphs-0.8 · Algebra.Graph"Graph"
"Algebra.Graph"
"algebraic-graphs-0.8-8JX2W3BiNP382gnPBc0Np8"
'False) ((C1 ('MetaCons"Empty"
'PrefixI 'False) U1 :+: C1 ('MetaCons"Vertex"
'PrefixI 'False) (S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a))) :+: (C1 ('MetaCons"Overlay"
'PrefixI 'False) (S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Graph a)) :*: S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Graph a))) :+: C1 ('MetaCons"Connect"
'PrefixI 'False) (S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Graph a)) :*: S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Graph a)))))type Vertex (Graph a) = aDefined in algebraic-graphs-0.8 · Algebra.Graph.Classtype ToVertex (Graph a) = aDefined in algebraic-graphs-0.8 · Algebra.Graph.ToGraph