On Tuesday, 26 August 2014 02:19:25 UTC+2, Bill Hart wrote:
>
>
>
> On Tuesday, 26 August 2014 00:40:34 UTC+2, Robert Bradshaw wrote:
>>
>> On Mon, Aug 25, 2014 at 1:24 PM, Bill Hart <goodwi...@googlemail.com> 
>> wrote: 
>>
>> >> > Correct. But classes are essentially objects in Python because 
>> >> > everything is 
>> >> > an object, pretty much. This really muddies the water. Better to 
>> think 
>> >> > of 
>> >> > classes and objects as being separate concepts. 
>> >> 
>> >> I, for one, find it very convenient (especially compared to using 
>> >> reflection and other hacks that are needed to reason about type at 
>> >> runtime in C++ or Java). Not that some languages aren't even better. 
>> >> 
>> >> > Also better to think of ZZ as a class in Sage and elements of ZZ as 
>> >> > objects, 
>> >> > even though actually ZZ happens to be an object too because Python. 
>> >> 
>> >> No. ZZ is an object because you might want to do things with it, like 
>> >> ask for it's properties (is it infinite?) 
>> > 
>> > Sorry if I have that wrong. But when I type ZZ?? into Sage, it pulls up 
>> the 
>> > definition of a class. 
>>
>> If a is an instance of class A, typing a?? will give you the definition 
>> of A. 
>>
>
> Ah thanks for pointing that out. I now see that 1 is an object of class 
> Integer, whereas ZZ is an object of class Integer_ring.
>
> So where I spoke of ZZ in Sage, please substitute Integer.
>
> (Except that I was using that as an argument for using ZZ as a name for my 
> bignum integer type in Julia; which argument you have now destroyed. I 
> would have liked to use Integer though. But it was already taken.)
>  
>
>>
>> > Anyway, it's irrelevant because Python. 
>> > 
>> > In Julia types are also able to be passed around as first class 
>> objects. 
>> > Which means you can define multimethods which take types as parameters. 
>> I do 
>> > this all the time in Nemo. 
>> > 
>> > So I can send a type to a function which gives me some properties of 
>> the 
>> > type, if I so wish. I thought about adding properties like is_infinite 
>> to 
>> > types in Nemo. But I found that I had been thinking the wrong way about 
>> > things all along. 
>>
>> Good, because I was worried there for a minute you were praising Julia 
>> for not treating types as first class objects. 
>>
>
> Nah. But I don't have anything against not making types first class 
> objects. So long as their constructors are.
>
> It also depends somewhat on your definition of first class.
>  
>
>>
>> >> or use it as a parameter 
>> >> (e.g. the domain of a Map object). Sometimes the Objects (in the 
>> >> categorical sense) are more interesting than their elements. 
>> > 
>> > If you are a category theorist yes. Most mathematicians think 
>> categories are 
>> > just sets. 
>> > 
>> >> 
>> >> If your Objects are parameterized types, 
>> >> 
>> >> I'm curious how you handle in 
>> >> Julia the fact that R[x] is a Euclidean domain iff R is a field. 
>> > 
>> > I'm curious, is the category of Euclidean domains a full subcategory of 
>> > Rings? 
>>
>> I think so; the Euclidean property doesn't place any constraint on the 
>> morphisms. 
>>
>
> I should have asked whether Fields were. Some references say yes, some no.
>
> It's also really funny that if you look up Category of Euclidean Domains 
> on the intertubes you get two types of pages in general. The first is Wiki 
> articles that use the words category and subcategory in the common speech 
> sense, not in the mathematical sense. Then there is the Sage documentation, 
> which speaks of the Category of Euclidean Domains.
>
> As a concept, it just isn't that useful to category theorists (apparently; 
> I wouldn't know, I'm not a category theorist).
>
> My point is really that having a typeclass hierarchy that revolves around 
> category theory isn't necessarily useful.
>
> Euclidean rings (and more specifically Euclidean domains) are a difficult 
> concept to model in a type hierarchy, because it is not that easy to tell 
> when a ring is a Euclidean ring, and if so, what the Euclidean function is 
> on that ring.
>
> Also, the Euclidean function may only be used implicitly in any algorithms 
> used to compute a gcd. So the Euclidean function is not that useful. And 
> there may be more than one Euclidean structure on a ring, e.g. Z/nZ for n 
> composite.
>
> The upshot of this is that whether or not a ring has a Euclidean function 
> defined on it is probably not something you want to represent in an 
> "interface". Thus, it is not that useful a concept when defining a 
> typeclass or interface for types to belong to.
>
> You could make your interface depend on whether there is a gcd function. 
> But such a function could just return an ideal, for example in a Dedekind 
> domain (Sage even does this; inconsistently). So whether there is a gcd 
> function is neither here nor there.
>
> So I would argue right from the outset that EuclideanDomain is neither a 
> useful concept category theory-wise, nor computationally.
>
> Note that there is no EuclideanDomain typeclass currently in Nemo (I know 
> I did provide it in my big long list of typeclasses that could be added).
>
>
>> I am still curious how you would express that 
>> UnivariatePolynomialRing{QQ} <: EuclideanDomans but the same doesn't 
>> hold for UnivariatePolynomialRing{ZZ} in Julia. 
>>
>
> You wouldn't do this. But suppose you would.
>
> You might have:
>
> abstract Ring
> abstract EuclideanDomain <: Ring 
>
> type Poly{T <: Ring} <: Ring
>     # blah blah
> end
>
> type EuclideanPoly{T <: Field} <: EuclideanDomain
>    # more blah blah
> end
>
> The type construction function PolynomialRing can then be written such
>
> PolynomialRing{T <: Ring}(::Type{T}, S::string) # this is the generic 
> function which gets called if T is a ring but not a field
>    # return a Poly
> end
>
> PolynomialRing{T <: Field}(::Type{T}, S::string) # this function 
> specialises the previous one, when T happens to be a field
>    # return a EuclideanPoly
> end
>
> There are various ways you could handle functions that take either an 
> EuclideanPoly or a Poly. For example
>
>
Sorry, I had some errors in this next bit.
 

> myfun(a :: Union(EuclideanPoly, Poly))
>
> or
>
> typealias AnyPoly Union(EuclideanPoly, Poly)
>
> myfun(a :: AnyPoly)
>
>
It should have been

myfun{T <: Union(EuclideanPoly, Poly)}(a :: T)

or 

typealias AnyPoly Union(EuclideanPoly, Poly)

myfun{T <: AnyPoly}(a :: T)

I didn't compile this lot to check. It's a silly way to do things. Trying 
too hard to be clever.

And there are various ways you could handle functions that take elements of 
> a EuclideanDomain or a general Ring. E.g.
>
> myfun{T <: EuclideanDomain}(a :: T)
>
> myfun{T <: Ring}(a :: T)
>
> But I don't think there is any compelling reason to go to all of this 
> trouble. A much better and cleaner way is the following.
>
> abstract Ring
>
> type Poly{T <: Ring} <: Ring
>   # blah blah
> end
>
> abstract GCDDomain <: Ring
> abstract Field <: GCDDomain # it's questionable whether you really want to 
> do this instead of Field <: Ring, but that's another story
>
> typealias EuclideanDomain{T <: Field} Union(GCDDomain, Poly{T})
>
> function myfun{T <: EuclideanDomain}(a :: T)
>    # blah
> end
>
> This lot all compiles by the way. And you can check it really works:
>
> First define a type which belongs to Field:
>
> type Bill <: Field
> end
>
> julia> myfun(Bill())
>
> julia> myfun(Poly{Bill}())
>
> No complaints.
>
> Now define a type which is not a field, but just a ring:
>
> type Fred <: Ring
> end
>
> And then:
>
> julia> myfun(Poly{Fred}())
> ERROR: `myfun` has no method matching myfun(::Poly{Fred})
>
> julia> myfun(Fred())
> ERROR: `myfun` has no method matching myfun(::Fred)
>
> However, in all of the above, you see that I never actually used GCDDomain 
> at all. So it can really be removed if so desired. It's likely you defined 
> a gcd function for some clean set of rings in the first place, which can 
> all be delineated nicely without having some special typeclass for it.
>
> And then, in reality, EuclideanDomain is just a union of various types, 
> just as the particular rings you can define a gcd function for is an 
> eclectic mix, with no particular rhyme or reason to it.
>
>
>> >> (As 
>> >> you mention, trying to use the type hierarchy in Python to model 
>> >> categorical relationships in Sage has generally lead to pain which is 
>> >> why we're moving away from that...) 
>> > 
>> > Oh I can't think why. 
>>
>> I buy that the type system is more powerful in Julia (yay), but I'm 
>> still skeptical that it is the best way to express the relationship 
>> between objects and categories, and at the same time elements and 
>> objects, and attach useful information to those categories and 
>> objects. 
>>
>
> That was kind of the point of my earlier post. There is no such best way. 
> Categories don't match any concept in computer science (well, that is not 
> strictly true, but that's a long diversion into n-categories and homotopy 
> types). Usually we can't push the carpet down around all the corners of the 
> room, but we can get it sufficiently flat locally.
>  
> Bill.
>
>
>> - Robert 
>>
>

-- 
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