2010-11-28 5 views
7

Hallo, ich habe diesen Ausschnitt aus dem Code:verschachtelte lokale Deklarationen in ML von NJ

local 
helper(f, i, j) = local 
        fun NTimesF(f, n:int) = 
        if n = 1 then fn (x) => f(x) 
        else fn (x) => f(NTimesF(f, n - 1)(x)); 
        in 
        if(i <= j) then NTimesF(f, i) :: helper(f, (i+1), j) 
        else [] 
        end 
in 
fun compList f n = helper(f, 1, n); 
end; 

Ich brauche Programm zu schreiben, die eine Funktion f und natürliche Zahl n und produzieren Liste von Funktionen wie [f1 empfängt, f2, ... fn] < - fn die Zusammensetzung der Funktion n-mal ist, aber jedes Mal, wenn ich einen Fehler erhalten:

- stdIn:1.1-2.9 Error: syntax error: deleting LOCAL ID LPAREN 
stdIn:2.10-2.14 Error: syntax error: deleting COMMA ID COMMA 
stdIn:2.16-2.25 Error: syntax error: deleting RPAREN EQUALOP LOCAL 
stdIn:3.6-3.17 Error: syntax error: deleting FUN ID 
stdIn:4.6-4.10 Error: syntax error: deleting IF ID 
stdIn:4.15-4.22 Error: syntax error: deleting THEN FN 
stdIn:4.27-4.31 Error: syntax error: deleting DARROW ID 
stdIn:5.6-5.13 Error: syntax error: deleting ELSE FN 
stdIn:5.16-5.22 Error: syntax error: deleting RPAREN DARROW ID 
stdIn:6.8-7.8 Error: syntax error: deleting IN IF 
stdIn:7.17-7.29 Error: syntax error: deleting THEN ID 
stdIn:8.6-8.13 Error: syntax error: deleting ELSE LBRACKET RBRACKET 
stdIn:9.8-11.5 Error: syntax error: deleting END IN FUN 

es scheint, dass meine verschachtelten lokalen Erklärungen falsch sind, kann jemand bitte erklären, warum?

Antwort

20

Es gibt zwei Möglichkeiten, lokale Funktionen und Variablen in SML zu definieren: local ... in ... end und let ... in ... end.

Der Unterschied zwischen local und let ist, dass mit local was kommt zwischen inend und einer oder mehr Variablen oder Funktionsdeklarationen. Mit let ist das, was zwischen in und end kommt, ein Ausdruck.

Gegensatz local, let ist ein Ausdruck, und der Wert eines let Ausdruck ist der Wert des Ausdrucks zwischen in und end.

Da in Ihrem Fall, dass Sie einen Ausdruck zwischen in haben und end (und Sie wollen, dass die Funktion auf das Ergebnis dieses Ausdrucks bewerten), müssen Sie let verwenden, nicht local.

+0

@ sepp2k: vielen Dank, ich habe zwei "local" auf zwei "let" geändert, trotzdem bekomme ich 4 erste Fehler, darf es etwas anderes sein? – rookie

+0

@rookie: Nein, das äußere 'local' ist korrekt. Sie müssen nur das innere 'local' in' let' ändern (dasjenige, das einen Ausdruck enthält). – sepp2k

+0

@rookie: Auch Sie vermissen ein 'Spaß' vor 'Helfer (f, i, j)' – sepp2k