Rather than speficying return types as a type transformation from
parameter types, assume that all the type info can be
inferred from the first parameter, and directly specify the
implementation types. Vastly simplifies the declaration of
implementation types.