I think part of the confusion here is that "matrix addition" isn't actually a binary operator, but rather a family of binary operators parametrized over the matrix dimensions. There's +<2,2> for 2 x 2 matrices, +<2,3> for 2 x 3 matrices, etc. Similarly, the "zero matrix" is actually parametrized over dimensions. 0<2,2> is different from 0<2,3>. For any n,m: +<n,m> has the identity 0<n,m>. If we wanted to properly represent that in Rust, we would need type level naturals that we could parametrize Matrix over.
Regarding the range thing, I thought for a minute that it might make sense if we required Mul+One+Add+Zero to be a ring (which is the intention I think), but I don't think that's actually true in general for rings (i.e. that 1 is a generating set of the underlying group). On Wed, Apr 9, 2014 at 1:42 PM, Kevin Ballard <ke...@sb.org> wrote: > The number 0 is the additive identity for numbers. But informally, the > additive identity for other things can be called "zero" without problem. > Heck, even the wikipedia page on Additive Identity uses this example for > groups: > > > Let (G, +) be a group and let 0 and 0' in G both denote additive > identities, so for any g in G, > > > > 0 + g = g = g + 0 and 0' + g = g = g + 0' > > It follows from the above that > > > > (0') = (0') + 0 = 0' + (0) = (0) > > Look at that, an additive identity for something other than a number, and > zero (0) is used to denote this additive identity. > > The only issue comes in when you define addition in multiple different > ways for a single type. Of course, right now I believe compiler bugs > prevent you from actually using multiple implementations of Add<> with > different type parameters for a given type, so this isn't actually a > problem right now. And when that bug is fixed, it's still reasonable to > consider Zero to be the additive identity for any addition where the > receiver type is the right-hand side of the addition. In other words, if > you define Add<uint, Matrix> for Matrix, then the additive identity here is > Zero::<for uint>, not Zero::<for Matrix>. > > Regarding "You can't assign a zero to a 2x2 matrix", additive identity > does not require the ability to assign. And this is only a problem when > considering addition between disparate types. If you consider matrix > addition (e.g. 2x2 matrix + 2x2 matrix) then you certainly can assign the > additive identity back to one of the matrix values. > > let m: Matrix = Zero::zero(); > > looks fine to me. It produces a matrix m that, when added to any other > Matrix m', produces the same matrix m'. This is presumably a Matrix where > every element is 0. But again, this only makes sense if you've actually > defined Add<Matrix,Matrix> for Matrix. > > Regardless, we've already made the decision not to go down numeric type > hierarchy hell. We're trying to keep a reasonable simple numeric hierarchy. > And part of that means using straightforward "lay-person" terms instead of > perhaps more precise mathematical names. As such, we have std::num::Zero as > the additive identity and std::num::One as the multiplicative identity. > > If you really want to complain about something, complain about > std::num::One being used for things other than multiplicative identity, > e.g. std::iter::range() uses Add and One to produce the next value in the > range. > > -Kevin > > On Apr 9, 2014, at 1:25 PM, Tommi Tissari <rusty.ga...@icloud.com> wrote: > > >> On 09 Apr 2014, at 20:46, Kevin Ballard <ke...@sb.org> wrote: > >> > >> Why? Zero is the additive identity. > > > > Zero is _an_ additive identity for numbers, but not for vectors or > matrices. > > > > use std::slice::Items; > > use std::iter::RandomAccessIterator; > > use std::num::Zero; > > > > Items is a RandomAccessIterator, but a RandomAccessIterator is not an > Items. 0 is an additive identity, but an additive identity is not 0. You > can't assign a zero to a 2x2 matrix, and therefore this trait is > incorrectly named. The following just looks wrong: > > > > let m: Matrix = Zero::zero(); > > > >> AdditiveIdentity is the only reasonable alternative, but that's a > mouthful of a name and I think changing the name to this would be more > confusing. > > > > Naming a trait something that it's not is even more confusing. I don't > think we should give an incorrect name to this trait on the grounds of the > correct name being longer. Just look at RandomAccessIterator. > > > > _______________________________________________ > Rust-dev mailing list > Rust-dev@mozilla.org > https://mail.mozilla.org/listinfo/rust-dev >
_______________________________________________ Rust-dev mailing list Rust-dev@mozilla.org https://mail.mozilla.org/listinfo/rust-dev