It's been a while since I used OCaml or SML, so I went back to check. You're correct that in OCaml functions of multiple parameters are idiomatically represented as curried functions:

https://ocaml.org/docs/values-and-functions#defining-functio...

It's a bit harder to tell the situation in SML, because it isn't really an actively used language. "ML for the Working Programmer" (lol) appears to idiomatically represent them as functions a single tuple parameter:

https://www.cl.cam.ac.uk/~lp15/MLbook/PDF/chapter2.pdf

> SML [...] appears to idiomatically represent them as functions of a single tuple parameter

Tuple is not special, though. Functions accept a single argument of any type.

To use the argument in the function body you can name it, or you can use any valid pattern to destructure it and bind parts of it to local variables.

Tuple is just one of the valid patterns. Coincidentally, it looks like argument list with positional arguments in many other languages. You can also use a record, which makes it look like "keyword arguments". You can also use patterns of custom types.

All the above is still about the single "argument" case, the single value that is "physically" passed to the function. Pattern matching is what makes it possible to bind parts of that value to multiple local variables in the body of the function.