use HList to collect function arguments instead of tuples