(* --- recursive functions --- *) (* From Section 1.12 *) fun factorial(0) = 1 | factorial(n) = n * factorial(n-1); (* Ex 1.12.4. Homemade multiply *) fun multiply(x, 0) = 0 | multiply(x, y) = x + multiply(x, y-1); (* Ex 1.12.6. Summation. *) fun sum(1) = 1 | sum(n) = n + sum(n-1); (* For the assignment *) (* Ex 1.11.4 *) fun divideAll(a, b) = ( ??, ??, ??); (* interpret the first int as numerator and second as denominator *) datatype rational = Fraction of int * int; fun gcd(a, 0) = a | gcd(a, b) = gcd(b, a mod b); fun add(Fraction(a, b), Fraction(c, d)) = let val numerator = a * d + c * b; val denominator = b * d; val divisor = gcd(numerator, denominator); in Fraction(numerator div divisor, denominator div divisor) end;