Home
  
module category-theory.functor where
Imports
open import foundations.universe
open import foundations.identity-type
open import foundations.sigma-type
open import foundations.retraction
open import category-theory.category
 
record FunctorData {o₁ h₁ o₂ h₂}
  (𝒞 : CategoryData o₁ h₁) (𝒟 : CategoryData o₂ h₂)
  : Type (o₁ ⊔ h₁ ⊔ o₂ ⊔ h₂) where
  private module 𝒞 = CategoryData 𝒞
  open CategoryData 𝒟
  field
    F₀ : 𝒞.Ob → Ob
    F₁ : ∀ {A B} → (f : 𝒞.Hom A B)
      → Hom (F₀ A) (F₀ B)
  ₀ = F₀
  ₁ = F₁
module _ {o₁ h₁ o₂ h₂}
  (𝒞 : CategoryData o₁ h₁) (𝒟 : CategoryData o₂ h₂) where
  private module 𝒞 = CategoryData 𝒞
  open CategoryData 𝒟
  functorDataToΣ : FunctorData 𝒞 𝒟
    → Σ[ F₀ ∈ (𝒞.Ob → Ob) ] (∀ {A B} → (f : 𝒞.Hom A B) → Hom (F₀ A) (F₀ B))
  functorDataToΣ F = FunctorData.₀ F , FunctorData.₁ F
  ΣToFunctorData :
    Σ[ F₀ ∈ (𝒞.Ob → Ob) ] (∀ {A B} → (f : 𝒞.Hom A B) → Hom (F₀ A) (F₀ B))
    → FunctorData 𝒞 𝒟
  ΣToFunctorData (F₀ , F₁) = record { F₀ = F₀ ; F₁ = F₁ }
  hasRetractionFunctorDataToΣ : HasRetraction functorDataToΣ
  hasRetractionFunctorDataToΣ .fst = ΣToFunctorData
  hasRetractionFunctorDataToΣ .snd F = refl
record isFunctor {o₁ h₁ o₂ h₂} (𝒞 : Category o₁ h₁) (𝒟 : Category o₂ h₂)
  (F : FunctorData (Category.𝒞 𝒞) (Category.𝒞 𝒟)) : Type (o₁ ⊔ h₁ ⊔ h₂) where
  private module 𝒞 = Category 𝒞
  open Category 𝒟
  open FunctorData F
  field
    preserve-id : ∀ (A : 𝒞.Ob)
      → F₁ (𝒞.id A) = id (F₀ A)
    preserve-∘ : ∀ {A B C} (f : 𝒞.Hom A B) (g : 𝒞.Hom B C)
      → F₁ (g 𝒞.∘ f) = F₁ g ∘ F₁ f
record Functor {o₁ h₁ o₂ h₂} (𝒞 : Category o₁ h₁) (𝒟 : Category o₂ h₂)
  : Type (o₁ ⊔ h₁ ⊔ o₂ ⊔ h₂) where
  field
    F : FunctorData (Category.𝒞 𝒞) (Category.𝒞 𝒟)
    is-functor : isFunctor 𝒞 𝒟 F
  open FunctorData F public
  open isFunctor is-functor public