Uncurried mode actually isn’t the same as the old uncurry semantics, it’s another thing entirely. As an example, internally in uncurried mode each function is wrapped in a variant constructor Function$ that describes its arity and the function itself. Same goes for a bunch of other things like types and so on. A lot of uncurried mode is handled at the syntax level and in the parser itself - the proper AST is constructed by the parser directly when parsing.
So there’s simply no way to express what’s needed in ml syntax. But if everything is ReScript syntax, most of uncurried mode comes for free since the parser does all the heavy lifting. No special care is needed from the user itself. This is a big part in how we’re trying to make uncurried mode as easily adoptable as possible. Outside of adapting to not use autocurrying (partial application is still a thing, just that it’s explicit), users shouldn’t really need to do anything special to adapt to uncurried mode.