2010-11-20 3 views
0

я должен написать некоторую функцию NTimesComposition (F: (интермедиат * Int -> Int), N INT), который получает некоторую функцию е и целого числа п и после выполнения композиции F , n раз, как это f (x, (f (x, f (x, y)))) < - (здесь, например, n = 3) Я начал писать его на smlnj, но он кажется более сложным, чем Я думал, заранее спасибо за любую идею:состав функций

NTimesComposition(f:(int * int -> int), n:int) 
    if n = 1 then fn(x,y) => f(x, y) else NTimesComposition...//here I'm stuck, must be recurstion 

ответ

1

вы уже получили его при п = 1, и вы, скорее всего, просто забыли передать (x, y) в рекурсивном вызове для n> 1. Очевидно, здесь это должно быть что-то вроде формы fn (x,y) => f (x, ...), где часть ... - это то, где ваши рекурсивные вызовы будут.

Если бы вы забыли (x,y) в рекурсивной части, что делает его fn (x,y) => NTimesComposition (f, n-1) то вы бы в конечном итоге создание цепочки анонимных функций, как «длинный» в качестве аргумента n описывает. Это приведет к другому типу вашей функции NTimesComposition в зависимости от того, что вы поставляете n, что недопустимо из-за того, как работает система типа SML (Hindley-Milner).

Следующие две функции будет выполнять работу для вас

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)) 

где первый напоминает код Наиболее используя анонимную функцию.

Смежные вопросы