2010-11-28 20 views
7

hola a todos tengo este fragmento de código:declaraciones locales anidadas en ML de 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; 

necesito escribir programa que recibe alguna función f y número entero n y lista de funciones producir tales como [f1, F2, ... Fn] < - fn es la composición de la función n veces, pero cada vez que recibo un error:

- 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 

parece que mis declaraciones locales anidados están equivocados, puede alguien por favor explicar por qué?

Respuesta

20

Hay dos formas de definir funciones y variables locales en SML: local ... in ... end y let ... in ... end.

La diferencia entre local y let es que con lo que se interpone entre localin y end son una o más declaraciones de variable o función. Con let lo que viene entre in y end es una expresión.

diferencia de local, let es una expresión y el valor de una expresión let es el valor de la expresión entre in y end.

Dado que en el caso de que tenga una expresión entre in y end (y desea que la función de evaluar el resultado de esa expresión), es necesario utilizar let, no local.

+0

@ sepp2k: muchas gracias, cambié dos "locales" por dos "let", de todos modos recibo 4 primeros errores, ¿puede ser algo más? – rookie

+0

@rookie: No, el 'local' externo es correcto. Solo necesita cambiar el 'local' interno a' let' (el que contiene una expresión). – sepp2k

+0

@rookie: También te falta un 'divertido' antes de' helper (f, i, j) ' – sepp2k

Cuestiones relacionadas