On 22 February 2015 at 10:00, Eric Gourgoulhon <egourgoul...@gmail.com> wrote:
> Hi Simon,
>
> Le dimanche 22 février 2015 00:28:42 UTC+1, Simon King a écrit :
>>
>> Hi Eric,
>>
>> On 2015-02-21, Eric Gourgoulhon <egourg...@gmail.com> wrote:
>> > It seems that a possible way to have 0 + MyElement work even if ZZ does=
>> >=20
>> > not coerce to MyElement.parent() is to have=20
>> > MyElement.parent()._element_constructor_ accept 0 (i.e. Integer(0)) as
>> > an=
>> >=20
>> > argument and return the zero element of your vector space / module for
>> > such=
>> >=20
>> > an argument.  Am I correct?=20
>>
>> That's conversion. It would *not* enable x+0.
>
>
> Yes that's conversion, but both 0+x and x+0 works because, I think, of lines
> 979-990 of
> sage.structure.coerce.pyx:
>         # Allow coercion of 0 even if no coercion from Z
>         if is_Integer(x) and not x and type(yp) is not type:
>             try:
>                 return yp(0), y
>             except Exception:
>                 self._record_exception()
>
>         if is_Integer(y) and not y and type(xp) is not type:
>             try:
>                 return x, xp(0)
>             except Exception:
>                 self._record_exception()
>
>
> Here is the example on free modules of #15916:
>
> sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
> sage: e = M.basis('e')
> sage: x = M([1,-2,3], basis=e) ; x
> Element of the Rank-3 free module M over the Integer Ring
> sage: x.display()
> e_0 - 2 e_1 + 3 e_2
>
> There is conversion of 0 to an element of M, but no coercion of ZZ into M:
>
> sage: M(0)
> Element zero of the Rank-3 free module M over the Integer Ring
> sage: M.has_coerce_map_from(ZZ)
> False
>
> Because of the lines of coerce.pyx listed above, we have:
>
> sage: cm = sage.structure.element.get_coercion_model()
> sage: cm.canonical_coercion(0, x)
> (Element zero of the Rank-3 free module M over the Integer Ring,
>  Element of the Rank-3 free module M over the Integer Ring)
> sage: cm.canonical_coercion(x, 0)
> (Element of the Rank-3 free module M over the Integer Ring,
>  Element zero of the Rank-3 free module M over the Integer Ring)
>
> so that both x+0 and 0+x works:
>
> sage: s = 0 + x ; s
> Element of the Rank-3 free module M over the Integer Ring
> sage: s.display()
> e_0 - 2 e_1 + 3 e_2
> sage: s = x + 0 ; s
> Element of the Rank-3 free module M over the Integer Ring
> sage: s.display()
> e_0 - 2 e_1 + 3 e_2
>
> Because there is "is_Integer(x)" in line 980 of coerce.pyx, this does not
> work for a 0 different from ZZ(0):
>
> sage: zq = QQ(0)
> sage: cm.canonical_coercion(zq, x)
> ...
> TypeError: no common canonical parent for objects with parents: 'Rational
> Field' and 'Rank-3 free module M over the Integer Ring'
>
> Indeed:
> sage: s = zq + x
> ...
> TypeError: unsupported operand parent(s) for '+': 'Rational Field' and
> 'Rank-3 free module M over the Integer Ring'
>
>
> Best regards,
>
> Eric.

My 2p-worth:   this all seems to be happening because of the implicit
automatic conversion from a literal 0 in Sage code to ZZ(0) in
contexts where a different zero exists (that of the parent of the
object to which 0 is going to be added).

Is there a case for having a separate global type or class for 0, to
which a literal 0 is coerced automatically on input, and which coerces
into every structure which has a 0 element?  This seems to make sense
to me (if I simply input 0, or assign x=0, Sage cannot know yet
whether I mean the Integer 0 or something else).  But I am not expert
in coercion and perhaps this would be hard (or impossible, or just
tedious) to implement.

John

>
>
> --
> You received this message because you are subscribed to the Google Groups
> "sage-devel" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to sage-devel+unsubscr...@googlegroups.com.
> To post to this group, send email to sage-devel@googlegroups.com.
> Visit this group at http://groups.google.com/group/sage-devel.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at http://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to