2010-11-28 103 views
7

的ML大家我有此片段的代碼:嵌套局部聲明在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; 

我需要編寫程序接收一些函數f和整數n和產生的函數列表如[F1, F2,... FN] < - FN是函數n次,但每一次的組成我收到一個錯誤:

- 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 

看來,我的嵌套局部聲明是錯誤的,可以有人請解釋一下爲什麼?

回答

20

有兩種方法可以在SML中定義局部函數和變量:local ... in ... endlet ... in ... end

locallet之間的區別是,local什麼來inend之間是一個或多個變量或函數聲明。與let什麼之間inend是一個表達式。

不同於locallet是表達和let表達式的值是表達式的inend之間的值。

由於你的情況,你有inend之間的表達式(和你想要的功能,以評估該表達式的結果),你需要使用let,不local

+0

@ sepp2k:非常感謝,我將兩個「本地」更改爲兩個「讓」,無論如何,我收到4個第一個錯誤,可能是別的嗎? – rookie 2010-11-28 14:33:39