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
-moduleM
viewed as anR
module whenS
is 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.moduleOrig
if 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.restrictScalars
LinearEquiv.restrictScalars
AlgHom.restrictScalars
AlgEquiv.restrictScalars
Submodule.restrictScalars
Subalgebra.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.
Equations
- ⋯ = ⋯
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))
Equations
- ⋯ = ⋯
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)) ⋯ ⋯