Я думаю, что наименее «искусственным» было бы что-то вроде:
fun f x y g = g (x, g (x, y))
, который гарантирует, что тип возвращаемого значения g соответствует типу его второго параметра, вызывая g дважды, и результат одного вызова будет второй аргумент к другому.
Но более простое решение, если это не «обман», это просто добавить явную аннотацию типа:
fun f x (y : 'b) g : 'b = g (x, y)