
One of this differences between Haskell and Clean I did not see mentioned in this discussion is that Clean does not allow so-called partial parametrisation. I.e. all function calls have to be fully saturated
I think there may be a misunderstanding here. Beware: I haven't used Clean in a while. (1) Clean didn't have sections. This is no big deal. Clean does have "flip" in StdFunc. (x +) => (+) x (+ y) => (flip (+)) y (2) Clean requires saturated *DEFINITIONS*. If you declare f :: A B C -> D then each rule you give for f must have exactly three arguments. If you declare f :: A -> B -> C -> D then each rule you give for f must have exactly one argument. See section 3.7 of the Clean 2.1 language report. This has no consequences for how you can *apply* such a function. Section 3.7.1 of the report is explicit: In CLEAN all symbols (functions and constructors) are defined with fixed arity. However, in an application it is of course allowed to apply them to an arbitrary number of arguments. A curried application of a function is an application of a function with a number of arguments which is less than its arity (note that in CLEAN the arity of a function can be derived from its type). With the aid of the predefined internal function _AP a curried function applied on the required number of arguments is transformed into an equivalent uncurried function application. The type axiom's (sic.) of the CLEAN type system include for all s defined with arity n the equivalence of s::(t1->(t2->(...(tn->tr)...)) with s::t1 t2 ... tn -> tr.