The function h should be an associative function, for otherwise the result may depend on internal details about the implementation of hash tables that affect the order in which entries are encountered. If f, t (if present), g, and h are commutative functions as well, then the result z is a commutative function of x and y.
The result is mutable if and only if x or y is.
This function can be used for multiplying polynomials, where it can be used in code something like this:
combine(x, y, monomialTimes, coeffTimes, coeffPlus)We illustrate that with a simple-minded implementation of the free ring on the English alphabet, representing words as string and polynomials as hash tables that associate coefficients to words.
i1 : Poly = new Type of HashTable o1 = Poly o1 : Type |
i2 : p = new Poly from { "" => 1, "x" => 2, "y" => 3, "cat" => 5 } o2 = Poly{ => 1 } cat => 5 x => 2 y => 3 o2 : Poly |
i3 : Poly * Poly := (p,q) -> combine(p,q,concatenate,times,plus); |
i4 : p*p o4 = Poly{ => 1 } cat => 10 catcat => 25 catx => 10 caty => 15 x => 4 xcat => 10 xx => 4 xy => 6 y => 6 ycat => 15 yx => 6 yy => 9 o4 : Poly |
combine(x, y, monomialTimes, divPowCoeff, coeffTimes, coeffPlus)For example:
i5 : DivPowPoly = new Type of HashTable o5 = DivPowPoly o5 : Type |
i6 : divPowCoeff = (i,j) -> binomial(i+j,i) o6 = divPowCoeff o6 : FunctionClosure |
i7 : p = new DivPowPoly from { 0 => 1, 1 => 1 } o7 = DivPowPoly{0 => 1} 1 => 1 o7 : DivPowPoly |
i8 : DivPowPoly * DivPowPoly := (p,q) -> combine(p,q,plus,divPowCoeff,times,plus); |
i9 : p*p o9 = DivPowPoly{0 => 1} 1 => 2 2 => 2 o9 : DivPowPoly |
The object combine is a compiled function.