Design proposal: Allow unary functions only, but product types. Products can be 0-ary or n-ary for n > 2 (the unary product of a type is just the type itself). Associated to each product type is a tupling constructor function (then selector functions are user-definable). N-ary functions are obtained either by currying or by product types.
This is adopted in many functional languages.
Of course, product types are user-definable. But
the composition of two functions f: t --> t1×t2
and g: t1×t2 --> u can be expressed directly
only with product types.
Alternatives:
Arities of predicates should be treated in the same way as arities of functions.