A tuple in ML is a product type of ( t * t ...)

OCaML has tuples like all the other MLs. Thus given a function f with a signature (int * int) -> int, invocation is written as something like:

f (1, 2)

So yes, they do accept tuples. This isn't weird, and is the standard way to write a multi-argument function in most of the ML family. In the 5th stage baudrillardian mess that OCaML has become in 2025 it might be weird since at some point they added implicit currying to the language and that became the default idiom. But personally I hate implicit currying and avoid it whenever possible.