]>
Conversion is the process of changing an object of one type into an object of another type. The syntax for conversion is:
By default, has the type PositiveInteger.
We can change this into an object of type Fraction Integer by using ``::''.
A coercion is a special kind of conversion that Axiom is allowed to do automatically when you enter an expression. Coercions are usually somewhat safer than more general conversions. The Axiom library contains operations called coerce and convert. Only the coerce operations can be used by the interpreter to change an object into an object of another type unless you explicitly use a ::.
By now you will be quite familiar with what types and modes look like. It is useful to think of a type or mode as a pattern for what you want the result to be.
Let's start with a square matrix of polynomials with complex rational number coefficients. SquareMatrix
We first want to interchange the Complex and Fraction layers. We do the conversion by doing the interchange in the type expression.
Interchange the Polynomial and the Fraction levels.
Interchange the Polynomial and the Complex levels.
All the entries have changed types, although in comparing the last two results only the entry in the lower left corner looks different. We did all the intermediate steps to show you what Axiom can do.
In fact, we could have combined all these into one conversion.
There are times when Axiom is not be able to do the conversion in one step. You may need to break up the transformation into several conversions in order to get an object of the desired type.
We cannot move either Fraction or Complex above (or to the left of, depending on how you look at it) SquareMatrix because each of these levels requires that its argument type have commutative multiplication, whereas SquareMatrix does not. That is because Fraction requires that its argument belong to the category IntegralDomain and category Complex requires that its argument belong to CommutativeRing. See ugTypesBasic for a brief discussion of categories. The Integer level did not move anywhere because it does not allow any arguments. We also did not move the SquareMatrix part anywhere, but we could have.
Recall that looks like this.
If we want a polynomial with matrix coefficients rather than a matrix with polynomial entries, we can just do the conversion.
We have not yet used modes for any conversions. Modes are a great shorthand for indicating the type of the object you want. Instead of using the long type expression in the last example, we could have simply said this.
We can also indicate more structure if we want the entries of the matrices to be fractions.