Computational Patterns

gray kangaroo

The objective of this code-along is to develop skills in restructuring expressions. The evaluation of an expression is performed through a sequence of computations. In some cases, such sequences contain redundant computations. When this happens variables can be declared to store the results of such computations.

The focus of this code-along is to generalize expression patterns using functions. More specifically, a function can be created that captures the computational similarity between patterns consisting of sequences involving sums. The pattern can then be re-expressed as an expression involving the newly created function.

(1 + 2 + 3) + (6 + 7 + 8)
(* version 1 *)
let
    fun f x = x + (x+1) + (x+2);
in 
    f 1 + f 6 
end;  
        
(* version 2 *)
let
    val c = 1 + 2;
    fun f x = x + x + x + c;  
in 
    f 1 + f 6 
end  
(1 + 2 + 3 + 4) + (6 + 7 + 8 + 9)
let
    val c = 1 + 2 + 3;
    fun f x = 
        let        
            val x1 = x + x; 
            val x2 = x1 + x1;
        in
            x2 + x2 + c
        end
in 
    f 1 + f 6 
end     
(4 + 9 + 16) + (16 + 25 + 36)
let
    fun sq x = x * x;        
    fun f x = sq(x)   + 
              sq(x+1) + 
              sq(x+2);
in 
    f 1 + f 6 
end