2010-11-20 3 views
0

Ich brauche Funktion NTimesComposition zu schreiben (f: (int * int -> int), n: int), die eine gewisse Funktion f und integer n und nach tun Zusammensetzung f erhält , n mal, wie dies f (x, (f (x, f (x, y)))) < - (hier zum Beispiel n = 3) Ich fing an, es auf smlnj schreiben, aber es scheint komplizierter als ich dachte, dank im Voraus für jede Idee:Zusammensetzung der Funktionen

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 

Antwort

1

Du hast es schon für n = 1 und Sie wahrscheinlich nur vergessen, diepassierenim rekursiven Aufruf für n> 1. Offensichtlich hier muss es etwas von der Form sein fn (x,y) => f (x, ...) wo der ... Teil ist, wo Ihre rekursiven Aufrufe sein wird.

Wenn Sie die (x,y) im rekursiven Teil vergessen hatte, so dass es fn (x,y) => NTimesComposition (f, n-1) dann würden Sie eine Kette von anonymen Funktionen als „lang“ Aufbau am Ende als Argument n beschreibt. Das würde zu einem anderen Typ Ihrer NTimesComposition-Funktion führen, je nachdem, was n Sie liefern, was nicht gültig ist, weil das SML-System funktioniert (Hindley-Milner).

Die folgenden beiden Funktionen wird die Arbeit für Sie tun

fun foo (f, 1) = (fn xy => f xy) 
    | foo (f, n) = (fn (x,y) => f(x, foo (f, n-1) (x,y))) 

und

fun baz (f, 1) xy = f xy 
    | baz (f, n) (x,y) = f(x, foo (f, n-1) (x,y)) 

, wo die erste die die anonyme Funktion mit Ihrem Code ähnelt.