On Monday, 25 August 2014 20:14:01 UTC+2, Robert Bradshaw wrote: > > On Mon, Aug 25, 2014 at 6:02 AM, Bill Hart <goodwi...@googlemail.com > <javascript:>> wrote: > > Hmm. Some more explaining is necessary. > > > > > > On Monday, 25 August 2014 12:04:16 UTC+2, Pierre wrote: > >> > >> Thanks again for the explanations. I realize that there were many > things > >> about Julia/Nemo which I had misunderstood. Let me explain a little, so > I > >> can (i) embarrass myself a little more, and (ii) perhaps give an > indication > >> of common mistakes, for anyone who would write a tutorial about > Julia/Nemo > >> :-) > >> > >> Mistake (1): taking it for OOP. > > > > > > Julia is OOP! > > > > There are two ways to do OOP. The first is with classes and usually > single > > dispatch and the other is with multi-methods. The latter is the Julia > way > > and it is more flexible. > > > > There is a dual notion for data structures as well, and Julia supports > that > > too, giving even greater flexibility. The combination of the two is more > > powerful than standard OOP, which can be very restrictive in practice. > > > >> > >> When hearing about the way Julia worked, I jumped when I saw it wasn't > OO, > >> and then naturally was looking for ways to emulate OOP with Julia > (rather > >> than make the effort of a paradigm shift). And with multi-dispatch, i > >> thought OK, if I want to write code that applies to objects of type A, > B and > >> C at once, just declare them A <: X, B <: X and C <: X and define f(x > :: X). > >> However this gave me the wrong intuition " A <: X is the same as A > inherits > >> from X". > > > > > > None of that makes sense. > > > > f(x :: X) is the way you write a function prototype in Julia. It > corresponds > > to the following prototype in C. > > > > void f(X x); > > > > X is just a type, like int or float or double or MyType, etc. In Julia, > you > > just write the type on the right, after a double colon, instead of on > the > > left like C. > > > > A <: X does not mean A is an object of type X. It means A is a subtype > of X, > > where both A and X are types (one or both may be abstract types). > > > > The way to write "A is an object of type X" is A :: X. > > > > The way to write "X is a subtype of Y" is X <: Y. > > > > But remember that subtype here *may* mean X is in the typeclass Y. > > > >> > >> At this point, the fact that abstract types could be instantiated was > seen > >> as a limitation compared to OOP. > > > > > > No. There is no similar concept in OOP, except for languages like scala > > which have traits/interfaces/typeclasses. It's an extension over and > above > > what is found in standard OOP languages. > > > > You can also write all your Julia programs without any <: symbols if you > > want. And in fact you can leave all types out too and let Julia figure > them > > out. > > > > Types and subtyping simply allows you to restrict what is allowed. > Otherwise > > everything is allowed, just like Python. > > > >> > >> And somehow, it is. > > > > > > No it is not. You never need to use the <: notation in Julia if you > don't > > want to. You can just stick to values (objects) and types (classes) if > you > > want. Then you have the same thing as standard OOP. You can even > restrict > > yourself to single dispatch if you want, in which case you have OOP > exactly. > > But there's no reason to restrict yourself in this way, because Julia > offers > > all the other goodies on top of that. > > > >> > >> Except at the same time, the type system does many new things. Apples > and > >> oranges, really. > >> > >> Mistake (2): taking types for sets. > > > > > > They sort of are. Formally a type is just a set of values. Well, not in > a > > mathematical sense. But in some intuitive sense. > > > > Types of course satisfy some calculus just as sets do and the rules of > the > > calculus are somewhat similar, but not quite the same. Technically > dependent > > types correspond exactly to predicates in the predicate logic, via Type > > theory (an extension of the Curry-Howard isomorphism). But that's all a > bit > > complicated, so we informally think of types as sets. > > > > One big difference is there are plenty of non-computable functions > between > > sets. But the functions between types are always computable. But again, > it's > > not even vaguely necessary to understand this to get the concept of a > type. > > It's intuitively just a name given to the collection of all values which > an > > object of that type can have. > > > >> This little discussion about names reveals another mistake of mine: > >> thinking of types as sets. I thought ZZ <: QQ for example. > > > > > > Yeah, the <: notation doesn't mean contained in. It's not a mathematical > > operator. It means "subtype of". There are three things the notation can > > mean: > > > > 1) If A <: B where A and B are types, then it means that if a function > can > > take an argument of type B, then an argument of type A will work just as > > well in its place. In some sense, the set of values of type A is a > > restriction of the set of values of type B. This is pretty close to a > subset > > meaning though technically it has more to do with the representation in > bits > > on the machine than anything mathematical. > > > > 2) If A <: B where A is a type and B is an abstract > > type/typeclass/interface/trait, it means that a function which requires > a > > type in class B can take the type A. This is not a subset meaning. It > means > > the type A belongs to the typeclass B. > > > > 3) If A <: B where A and B are both abstract > > types/typeclasses/interfaces/traits, it means that a function which > requires > > a type in class B can take a type in class A. This is a essentially a > subset > > meaning, but the sets here are sets of types, not sets of values as in > (1). > > > > There aren't many examples of (1) in Julia that I can think of. Trivial > ones > > such as Int <: Int are the only ones that come to mind. I really can't > think > > of any other examples. > > > > In fact, I think it is a general principle in Julia that concrete types > > cannot subtype one another. This isn't the case in some other languages, > but > > it is the case in Julia. So (1) above essentially never happens, except > for > > T <: T for concrete types T. > > > > This is maybe an oddity, but it's not a restriction. You can still cast > > between types to your heart's content. > > > >> That's not even consistent with the previous mistake. In Sage say, i'm > >> guessing QQ is of type Field or something, which inherits from a type > Ring > >> or something -- but not the other way around! > > > > > > Yeah in Julia you'd have QQ <: Field <: Ring. > > > > The first <: in that is of sort (2) above. The second <: is of sort (3). > > > >> So mistake (1) should have led me to believe QQ <: ZZ. Oh well. > > > > > > We have neither QQ <: ZZ nor ZZ <: QQ. Both are concrete types and may > not > > subtype each other. This is not essential, and in fact is not the case > in > > some other languages. But it is the case in Julia. > > > >> > >> > >> Mistake (3): thinking about Sage too much. To my discharge, ZZ in Sage > is > >> an object, > > > > > > 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. 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. > 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? > (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. > > > Roughly speaking a Julia value has some similarity to a Python object > and a > > Julia type has some similarity to a Python class. That's a very > misleading > > identification, but there is some truth to it. > > > > Sage is a different beast to Python. As I mentioned, ZZ is not meant to > be > > either an object or a class. It is meant to be a mathematical domain. > And > > mathematical domains are being *modeled* in Python using classes, (which > > just happen to be objects in Python for the LOL's). That's of course a > > bastardisation of all that is good and pure. But both identifications > occur > > for somewhat valid reasons. > > > > Classes are objects in Python so that you can do things to classes just > as > > you would any object in the language. The official reason is so that you > can > > rename and import classes. But I rather think there's more to it than > that. > > > > And mathematical domains in Sage are modeled as classes because that is > the > > most convenient thing in Python to model them with. Unlike Aldor, Python > > doesn't have a native domain or category concept. So you have to pick > > something that works well enough. > > > > It is worth noting that mathematical categories cannot in general be > modeled > > accurately with computer science types. There's a fundamental mismatch > > between category theory and types. This has led some mathematicians to > > completely redo the foundations of mathematics in terms of homotopy > classes > > instead of category theory. And this can be modeled accurately in terms > of > > Martin-L\"{o}f Type theory. This new foundation for mathematics is > called > > the Univalent Foundation for Mathematics, and was developed primarily by > > Vladimir Veovodsky based on the Type theory of Per Martin-L\"{o}f. > > > > I would suggest that a good dependent type system is just as good as a > > Martin-L\"{o}f Type Theory any day. So for most practical purposes we > can > > model mathematics reasonably well with dependent types. We can't quite > push > > the carpet down at the edges. But we can get most of the wrinkles out. > > > > Sage attempts to model a dependent type system using classes in Python. > I > > won't start a huge digression into the manifold problems with this > approach. > > But it involves a lot of work, for one thing. > > > >> like 1/2, not a type or anything. > > > > > > It's better to think of it as a type or class if you want to think of it > as > > anything computational. It happens to be an object too. But that is an > > accident forced on you by Smalltalk, err I mean Python. > > > >> > >> This has unconsciously contributed to my confusion greatly. Also the > fact > >> that there is a coercion from ZZ to QQ, and somewhere I must have taken > A <: > >> B to mean "there is a coercion from A to B". > > > > > > Ah, no. Coercion is another thing entirely. That is primarily a > mathematical > > concept. Though there is a related computer science concept called > > conversion and promotion which has nothing to do with the mathematical > > concept of coercion, but which is the nearest related concept. > > > > Mathematical coercion is a myth. There is no consistent formal > foundation > > for coercion whatsoever. > > > > The mathematical concept of coercion is nothing more than a bunch of > > incompatible and inconsistent informal notions that mathematicians carry > > around in their collective heads to relate the informal, inconsistent > and > > incompatible definitions the carry around in their heads. > > > > Any formal and consistent axiomatisation of computer algebra will > deviate > > arbitrarily far from what any given mathematician thinks is reasonable. > > > > Anyway, best to think of A <: B as meaning A is a subtype of B, where in > > Julia at least B needs to be an abstract type, except in the trivial A > <: A > > case. > > > > In a sense, you do want to have coercions from types in class A to types > in > > class B where A <: B, usually. But it is much more subtle than that, > > especially in Julia where types can be parametric. Even if A <: B you > don't > > automatically have T{A} <: T{B} in Julia. This would be called a > covariant > > type system, whereas Julia is invariant. > > > > So even if you had ZZ <: QQ in Julia (which you don't), you wouldn't > > automatically have Poly{ZZ} <: Poly{QQ}. And even if you did, that would > > have nothing to do with conversions and promotions because the > conversion > > and promotion system can have arbitrary types in Julia and is completely > > decoupled from the subtyping system. > > > > Decoupling is good because it gives you more flexibility to do whatever > you > > want to do. You give your own meaning to things, and you only define the > > promotions and conversions you want. > > > > Bill. > >> > >> > >> Pierre > >> > >> > >> > >> > >> > >>> > > -- > > 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+...@googlegroups.com <javascript:>. > > To post to this group, send email to sage-...@googlegroups.com > <javascript:>. > > 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.