Hello Stefan, thanks for the explanations, this all looks really interesting to me.
On 19 July 2014 22:10, Stefan Karpinski <ste...@karpinski.org> wrote: > > This can be pretty straightforwardly handled with multiple dispatch > promotion in a parametric type system. Similar things are done in real code > regularly in Julia. Although I'm not going to try to define these > particular types, the polynomial, power series, and finite field example is > quite possible given appropriate type definitions – people have done similar > things <http://acooke.org/cute/FiniteFiel1.html>. An example that already > works and is similar in spirit, is figuring out that a Complex{BigInt} plus > a Vector{Rational{Int}} should be a Vector{Complex{Rational{BigInt}}}. This > falls out of a surprisingly small set of generic function methods and > promotion rules (which are just methods): > > julia> big(3)^100*im + [1, 1//2, 2] > 3-element Array{Complex{Rational{BigInt}},1}: > 1//1+515377520732011331036461129765621272702107522001//1*im > 1//2+515377520732011331036461129765621272702107522001//1*im > 2//1+515377520732011331036461129765621272702107522001//1*im > > It's funny because I have been thinking about this for quite a long time from a modern C++ perspective, and I had come to the conclusion that with constructs like std::enable_if you can get to these results with template metaprogramming in C++11. The tricky bit is to write arithmetic operators that are generic but do not "swallow up" every type. In this specific case, you would have the Vector's operator+ kick in instead of the Complex's one (somewhere the Vector's operator+ should be defined to have a "higher rank" than the operator+ of Complex), then you would need to deduce the common type from Complex{BigInt} + Complex{Rational{...}} (possibly via decltype()), and proceed to a recursion down in the type hierarchy. Of course as you point out you would need all the ancillary functions to actually perform the conversions from one type to the other. All this would entail quite a bit of template trickery, but I find it interesting that it could be implemented all at compile time. (I have a primitive prototype version of something like this implemented in a project of mine, hopefully eventually I will get around to do it properly :) Anyway, cheers for the interesting discussion. Francesco. -- 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.