Crazy idea, why not use Set's for this?

FiniteSet could play tuple's role.  For arbitrary number of arguments - we can use S.Naturals0.