The RestrictScalars type alias #
See the documentation attached to the RestrictScalars definition for advice on how and when to
use this type alias. As described there, it is often a better choice to use the IsScalarTower
typeclass instead.
Main definitions #
RestrictScalars R S M: theS-moduleMviewed as anRmodule whenSis anR-algebra. Note that by default we do not have aModule S (RestrictScalars R S M)instance for the original action. This is available as a defRestrictScalars.moduleOrigif really needed.RestrictScalars.addEquiv : RestrictScalars R S M ≃+ M: the additive equivalence between the restricted and original space (in fact, they are definitionally equal, but sometimes it is helpful to avoid using this fact, to keep instances from leaking).RestrictScalars.ringEquiv : RestrictScalars R S A ≃+* A: the ring equivalence between the restricted and original space when the module is an algebra.
See also #
There are many similarly-named definitions elsewhere which do not refer to this type alias. These
refer to restricting the scalar type in a bundled type, such as from A →ₗ[R] B to A →ₗ[S] B:
LinearMap.restrictScalarsLinearEquiv.restrictScalarsAlgHom.restrictScalarsAlgEquiv.restrictScalarsSubmodule.restrictScalarsSubalgebra.restrictScalars
If we put an R-algebra structure on a semiring S, we get a natural equivalence from the
category of S-modules to the category of representations of the algebra S (over R). The type
synonym RestrictScalars is essentially this equivalence.
Warning: use this type synonym judiciously! Consider an example where we want to construct an
R-linear map from M to S, given:
variable (R S M : Type*)
variable [CommSemiring R] [Semiring S] [Algebra R S] [AddCommMonoid M] [Module S M]
With the assumptions above we can't directly state our map as we have no Module R M structure, but
RestrictScalars permits it to be written as:
-- an `R`-module structure on `M` is provided by `RestrictScalars` which is compatible
example : RestrictScalars R S M →ₗ[R] S := sorry
However, it is usually better just to add this extra structure as an argument:
-- an `R`-module structure on `M` and proof of its compatibility is provided by the user
example [Module R M] [IsScalarTower R S M] : M →ₗ[R] S := sorry
The advantage of the second approach is that it defers the duty of providing the missing typeclasses
[Module R M] [IsScalarTower R S M]. If some concrete M naturally carries these (as is often
the case) then we have avoided RestrictScalars entirely. If not, we can pass
RestrictScalars R S M later on instead of M.
Note that this means we almost always want to state definitions and lemmas in the language of
IsScalarTower rather than RestrictScalars.
An example of when one might want to use RestrictScalars would be if one has a vector space
over a field of characteristic zero and wishes to make use of the ℚ-algebra structure.
Equations
- RestrictScalars _R _S M = M
Instances For
Equations
- instInhabitedRestrictScalars R S M = I
Equations
- instAddCommMonoidRestrictScalars R S M = I
Equations
- instAddCommGroupRestrictScalars R S M = I
We temporarily install an action of the original ring on RestrictScalars R S M.
Equations
- RestrictScalars.moduleOrig R S M = I
Instances For
When M is a module over a ring S, and S is an algebra over R, then M inherits a
module structure over R.
The preferred way of setting this up is [Module R M] [Module S M] [IsScalarTower R S M].
Equations
- RestrictScalars.module R S M = Module.compHom M (algebraMap R S)
This instance is only relevant when RestrictScalars.moduleOrig is available as an instance.
When M is a right-module over a ring S, and S is an algebra over R, then M inherits a
right-module structure over R.
The preferred way of setting this up is
[Module Rᵐᵒᵖ M] [Module Sᵐᵒᵖ M] [IsScalarTower Rᵐᵒᵖ Sᵐᵒᵖ M].
Equations
- RestrictScalars.opModule R S M = Module.compHom M (RingHom.op (algebraMap R S))
The R-algebra homomorphism from the original coefficient algebra S to endomorphisms
of RestrictScalars R S M.
Equations
- RestrictScalars.lsmul R S M = Algebra.lsmul R R (RestrictScalars R S M)
Instances For
RestrictScalars.addEquiv is the additive equivalence with the original module.
Equations
- RestrictScalars.addEquiv R S M = AddEquiv.refl M
Instances For
Equations
- instSemiringRestrictScalars R S A = I
Equations
- instRingRestrictScalars R S A = I
Equations
- instCommSemiringRestrictScalars R S A = I
Equations
- instCommRingRestrictScalars R S A = I
Tautological ring isomorphism RestrictScalars R S A ≃+* A.
Equations
- RestrictScalars.ringEquiv R S A = RingEquiv.refl (RestrictScalars R S A)
Instances For
R ⟶ S induces S-Alg ⥤ R-Alg
Equations
- RestrictScalars.algebra R S A = Algebra.mk ((algebraMap S A).comp (algebraMap R S)) ⋯ ⋯