    "Given a function with return type `Y`, and a second
     function with a single parameter also of type `Y`, return
     the composition of the two functions. The first function
     may have any number of parameters.

     For any such functions `f()` and `g()`,

         compose(g,f)(*args)==g(f(*args))

     for every possible argument tuple `args` of `f()`."
    see(`function curry`, `function uncurry`)
    tagged("Functions")
    shared X(*Args) compose<X,Y,Args>(X(Y) x, Y(*Args) y)
            given Args satisfies Anything[]
                   => flatten((Args args) => x(y(*args)));
                   //=> flatten((Args args) => x(unflatten(y)(args)));