flip3_12 f a1 a2 a3 = f a2 a1 a3
flip3_13 f a1 a2 a3 = f a3 a2 a1
flip3_23 f a1 a2 a3 = f a1 a3 a2
And use these to partially apply any argument
e1 x = trace "e1" x
e2 x = trace "e2" x
op2 :: Int -> Int -> Int -> Int
op2 x y z = x+10*y+100*z
z1 = let f = (flip3_12 op2) (e1 1) (e2 2) in (f 3, f 4)
z2 = let f = (flip3_13 op2) (e1 1) (e2 2) in (f 3, f 4)
z3 = let f = (flip3_23 op2) (e1 1) (e2 2) in (f 3, f 4)
This could be extended to N-ary functions. Haskell doesn't give any special syntactic support for this, but it surely is possible.
Am I missing something here? Is there any easier way to perform "generalized partial application"?