Documentation

SSA.Core.EffectKind

inductive EffectKind :
Instances For
    Equations
    @[reducible]
    def EffectKind.toMonad (e : EffectKind) (m : TypeType) :
    Equations
    Instances For
      @[simp]
      theorem EffectKind.toMonad_pure {m : TypeType} :
      EffectKind.pure.toMonad m = Id
      @[simp]
      theorem EffectKind.toMonad_impure {m : TypeType} :
      EffectKind.impure.toMonad m = m

      NOTE: The Monad instance below also implies Functor, Applicative, etc. If m is a Functor, but not a full Monad, then e.toMonad m should still be a functor too. However, actually having these instances causes diamond problems with the aforementioned instances implied by Monad. Thus, we just assume m is always a monad.

      instance EffectKind.instMonadToMonad {e : EffectKind} {m : TypeType} [Monad m] :
      Monad (e.toMonad m)
      Equations
      • One or more equations did not get rendered due to their size.
      instance EffectKind.instLawfulMonadToMonad {e : EffectKind} {m : TypeType} [Monad m] [LawfulMonad m] :
      LawfulMonad (e.toMonad m)
      Equations
      • =
      def EffectKind.return {m : TypeType} {α : Type} [Monad m] (e : EffectKind) (a : α) :
      e.toMonad m α
      Equations
      Instances For
        @[simp]
        def EffectKind.return_eq {m : TypeType} {α : Type} [Monad m] (e : EffectKind) (a : α) :
        e.return a = pure a
        Equations
        • =
        Instances For
          @[simp]
          def EffectKind.return_pure_toMonad_eq {α : Type} {m : TypeType} (a : α) :
          pure a = a
          Equations
          • =
          Instances For
            @[simp]
            def EffectKind.return_impure_toMonad_eq {m : TypeType} {α : Type} [Monad m] (a : α) :
            pure a = pure a
            Equations
            • =
            Instances For

              PartialOrder #

              Establish a partial order on EffectKind

              Instances For
                @[simp]
                theorem EffectKind.le_refl (e : EffectKind) :
                e e
                @[simp]
                theorem EffectKind.le_trans {e1 : EffectKind} {e2 : EffectKind} {e3 : EffectKind} (h12 : e1 e2) (h23 : e2 e3) :
                e1 e3
                @[simp]
                theorem EffectKind.le_antisymm {e1 : EffectKind} {e2 : EffectKind} (h12 : e1 e2) (h21 : e2 e1) :
                e1 = e2
                theorem EffectKind.le_of_eq {e1 : EffectKind} {e2 : EffectKind} (h : e1 = e2) :
                e1 e2

                Lattice #

                EffectKind forms a lattice

                liftEffect #

                def EffectKind.liftEffect {m : TypeType} [Monad m] {e1 : EffectKind} {e2 : EffectKind} {α : Type} (hle : e1 e2) (v1 : e1.toMonad m α) :
                e2.toMonad m α

                Lift a value wrapped in effect e1 into effect e2, given that e1 ≤ e2.

                Said differently, this is a functor from the category of EffectKind (with e1 ≤ e2 as its arrows) to Lean (with e1.toMonad x → e2.toMonad x as its arrows).

                Equations
                Instances For
                  instance EffectKind.instMonadLiftOfLe {m : TypeType} {e1 : EffectKind} {e2 : EffectKind} (h : e1 e2) [Monad m] :
                  MonadLiftT (e1.toMonad m) (e2.toMonad m)
                  Equations
                  instance EffectKind.instMonadLiftTToMonadOfMonad (eff : EffectKind) {m : TypeType} [Monad m] :
                  MonadLiftT (eff.toMonad m) m
                  Equations
                  @[simp]
                  theorem EffectKind.liftEffect_rfl {m : TypeType} {eff : EffectKind} {α : Type} [Monad m] (hle : eff eff) :
                  theorem EffectKind.liftEffect_eq_pure_cast {α : Type} {m : TypeType} [Monad m] {eff : EffectKind} (eff_eq : eff = EffectKind.pure) (eff_le : eff EffectKind.impure) :
                  EffectKind.liftEffect eff_le = fun (x : eff.toMonad m α) => pure (cast x)

                  Forded version of liftEffect_pure_impure

                  @[simp]
                  @[simp]
                  theorem EffectKind.liftEffect_impure {m : TypeType} {α : Type} [Monad m] {e : EffectKind} (hle : e EffectKind.impure) :
                  EffectKind.liftEffect hle = match (motive := (e : EffectKind) → e EffectKind.impuree.toMonad m αEffectKind.impure.toMonad m α) e, hle with | EffectKind.pure, hle => fun (v : EffectKind.pure.toMonad m α) => pure v | EffectKind.impure, hle => id
                  @[simp]
                  theorem EffectKind.liftEffect_eq_id {eff : EffectKind} {m : TypeType} {α : Type} (hle : eff eff) [Monad m] :

                  toMonad is functorial: it preserves identity.

                  def EffectKind.liftEffect_compose {m : TypeType} {e1 : EffectKind} {e2 : EffectKind} {e3 : EffectKind} {α : Type} [Monad m] (h12 : e1 e2) (h23 : e2 e3) (h13 : optParam (e1 e3) ) :

                  toMonad is functorial: it preserves composition.

                  Equations
                  • =
                  Instances For