Doesn't that mean you're asking the compiler to have a full unification engine? Your example is simple, but the general case is more complicated:
 
void foo(T,U,V)(Tuple!(T,U) tup, V function(U) fun)
{ ... }
 
void main()
{
    foo(tuple(1,"abc"), (a) => 1.34); // so, I can deduce V to be double
 
    foo(tuple(1,"abc"), (int i) => i+); // error, U unified to string and int!
}