Вы уже получили его для n = 1, и вы, скорее всего, просто забыли передать (x, y)
в рекурсивном вызове для n> 1. Очевидно, что здесь должно быть что-то вроде fn (x,y) => f (x, ...)
, где ...
часть, где ваши рекурсивные вызовы будут.
Если бы вы забыли (x,y)
в рекурсивной части, сделав его fn (x,y) => NTimesComposition (f, n-1)
, то вы бы в итоге построили цепочку анонимных функций, столь же длинную, как описывает ваш аргумент n
. Это может привести к другому типу вашей NTimesComposition
функции в зависимости от того, что n
вы предоставляете, что недопустимо из-за того, как работает система типов SML (Хиндли-Милнер).
Следующие две функции выполнят эту работу за вас
fun foo (f, 1) = (fn xy => f xy)
| foo (f, n) = (fn (x,y) => f(x, foo (f, n-1) (x,y)))
и
fun baz (f, 1) xy = f xy
| baz (f, n) (x,y) = f(x, foo (f, n-1) (x,y))
, где первый больше всего напоминает ваш код с использованием анонимной функции.