# Spans of types

```agda
module foundation.spans where
```

<details><summary>Imports</summary>

```agda
open import foundation.dependent-pair-types
open import foundation.universe-levels

open import foundation-core.cartesian-product-types
open import foundation-core.function-types
```

</details>

## Idea

A {{#concept "binary span" Agda=span}} from `A` to `B` consists of a
{{#concept "spanning type" Disambiguation="binary span" Agda=spanning-type-span}}
`S` and a [pair](foundation.dependent-pair-types.md) of functions `f : S → A`
and `g : S → B`. The types `A` and `B` in the specification of a binary span are
also referred to as the {{#concept "domain" Disambiguation="binary span"}} and
{{#concept "codomain" Disambiguation="binary span"}} of the span, respectively.

In [`foundation.binary-type-duality`](foundation.binary-type-duality.md) we show
that [binary relations](foundation.binary-relations.md) are equivalently
described as spans of types.

We disambiguate between spans and [span diagrams](foundation.span-diagrams.md).
We consider spans from `A` to `B` to be _morphisms_ from `A` to `B` in the
category of types and spans between them, whereas we consider span diagrams to
be _objects_ in the category of diagrams of types of the form
`* <---- * ----> *`. Conceptually there is a subtle, but important distinction
between spans and span diagrams. As mentioned previously, a span from `A` to `B`
is equivalently described as a binary relation from `A` to `B`. On the other
hand, span diagrams are more suitable for functorial operations that take
"spans" as input, but for which the functorial action takes a natural
transformation, i.e., a morphism of span diagrams, as input. Examples of this
kind include [pushouts](synthetic-homotopy-theory.pushouts.md).

## Definitions

### (Binary) spans

```agda
span :
  {l1 l2 : Level} (l : Level) (A : UU l1) (B : UU l2)  UU (l1  l2  lsuc l)
span l A B = Σ (UU l)  X  (X  A) × (X  B))

module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2}
  (c : span l3 A B)
  where

  spanning-type-span : UU l3
  spanning-type-span = pr1 c

  left-map-span : spanning-type-span  A
  left-map-span = pr1 (pr2 c)

  right-map-span : spanning-type-span  B
  right-map-span = pr2 (pr2 c)
```

### Identity spans

```agda
module _
  {l1 : Level} {X : UU l1}
  where

  id-span : span l1 X X
  pr1 id-span = X
  pr1 (pr2 id-span) = id
  pr2 (pr2 id-span) = id
```

## See also

- [Binary type duality](foundation.binary-type-duality.md)
- [Cospans](foundation.cospans.md)
- [Span diagrams](foundation.span-diagrams.md)
- [Spans of families of types](foundation.spans-families-of-types.md)
- [Spans of pointed types](structured-types.pointed-spans.md)