Open
Description
If I define an additive group according to the instructions in the documentation, it still will not satisfy the AdditiveGroup trait, and I can't do addition with it (e.g. element + element
).
use alga::general::{AbstractMagma, Additive, AdditiveGroup, Identity, Inverse}; // 0.7.2
use alga_derive::Alga; // 0.7.1
#[derive(Alga, Clone, Copy, PartialEq, Debug)]
#[alga_traits(Group(Additive))]
pub struct TrivialGroup;
impl AbstractMagma<Additive> for TrivialGroup {
fn operate(&self, _right: &Self) -> Self {
TrivialGroup {}
}
}
impl Identity<Additive> for TrivialGroup {
fn identity() -> Self {
TrivialGroup {}
}
}
impl Inverse<Additive> for TrivialGroup {
fn inverse(&self) -> Self {
TrivialGroup {}
}
}
struct Bar<T: AdditiveGroup> {
t: T,
}
fn main() {
let foo = Bar::<TrivialGroup> { t: TrivialGroup {} };
}
Gives the error:
error[E0277]: the trait bound `TrivialGroup: num_traits::identities::Zero` is not satisfied
--> src/main.rs:31:15
|
31 | let foo = Bar::<TrivialGroup> { t: TrivialGroup {} };
| ^^^^^^^^^^^^^^^^^^^ the trait `num_traits::identities::Zero` is not implemented for `TrivialGroup`
|
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::AdditiveLoop` for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::AdditiveGroup` for `TrivialGroup`
note: required by `Bar`
--> src/main.rs:26:1
|
26 | struct Bar<T: AdditiveGroup> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0277]: the trait bound `TrivialGroup: std::ops::Neg` is not satisfied
--> src/main.rs:31:15
|
31 | let foo = Bar::<TrivialGroup> { t: TrivialGroup {} };
| ^^^^^^^^^^^^^^^^^^^ the trait `std::ops::Neg` is not implemented for `TrivialGroup`
|
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::ClosedNeg` for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::AdditiveLoop` for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::AdditiveGroup` for `TrivialGroup`
note: required by `Bar`
--> src/main.rs:26:1
|
26 | struct Bar<T: AdditiveGroup> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0277]: cannot subtract `TrivialGroup` from `TrivialGroup`
--> src/main.rs:31:15
|
31 | let foo = Bar::<TrivialGroup> { t: TrivialGroup {} };
| ^^^^^^^^^^^^^^^^^^^ no implementation for `TrivialGroup - TrivialGroup`
|
= help: the trait `std::ops::Sub` is not implemented for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::ClosedSub` for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::AdditiveQuasigroup` for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::AdditiveLoop` for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::AdditiveGroup` for `TrivialGroup`
note: required by `Bar`
--> src/main.rs:26:1
|
26 | struct Bar<T: AdditiveGroup> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0277]: cannot subtract-assign `TrivialGroup` from `TrivialGroup`
--> src/main.rs:31:15
|
31 | let foo = Bar::<TrivialGroup> { t: TrivialGroup {} };
| ^^^^^^^^^^^^^^^^^^^ no implementation for `TrivialGroup -= TrivialGroup`
|
= help: the trait `std::ops::SubAssign` is not implemented for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::ClosedSub` for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::AdditiveQuasigroup` for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::AdditiveLoop` for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::AdditiveGroup` for `TrivialGroup`
note: required by `Bar`
--> src/main.rs:26:1
|
26 | struct Bar<T: AdditiveGroup> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0277]: cannot add-assign `TrivialGroup` to `TrivialGroup`
--> src/main.rs:31:15
|
31 | let foo = Bar::<TrivialGroup> { t: TrivialGroup {} };
| ^^^^^^^^^^^^^^^^^^^ no implementation for `TrivialGroup += TrivialGroup`
|
= help: the trait `std::ops::AddAssign` is not implemented for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::ClosedAdd` for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::AdditiveSemigroup` for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::AdditiveMonoid` for `TrivialGroup`
= note: required because of the requirements on the impl of `_ALGA_DERIVE_TrivialGroup::_alga::general::AdditiveGroup` for `TrivialGroup`
note: required by `Bar`
--> src/main.rs:26:1
|
26 | struct Bar<T: AdditiveGroup> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
See also: https://stackoverflow.com/questions/54303935/defining-additivegroup-with-alga-crate
Metadata
Metadata
Assignees
Labels
No labels