Task

Create a function, compose,   whose two arguments   f   and   g,   are both functions with one argument.



The result of compose is to be a function of one argument, (lets call the argument   x),   which works like applying function    f    to the result of applying function    g    to    x.



Example

 compose(f, g) (x) = f(g(x))



Reference: Function composition

Hint: In some languages, implementing compose correctly requires creating a closure.




 
class Compose
{
  static |Obj -> Obj| compose (|Obj -> Obj| fn1, |Obj -> Obj| fn2)
  {
    return |Obj x -> Obj| { fn2 (fn1 (x)) }
  }
 
  public static Void main ()
  {
    double := |Int x -> Int| { 2 * x }
    |Int -> Int| quad := compose(double, double)
    echo ("Double 3 = ${double(3)}")
    echo ("Quadruple 3 = ${quad (3)}")
  }
}
 