7

大家好,我有这段代码:

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

看来我的嵌套本地声明是错误的,有人可以解释为什么吗?

4

1 回答 1

21

在 SML 中定义局部函数和变量有两种方法:local ... in ... endlet ... in ... end.

and之间的区别在于andlocal之间是一个或多个变量或函数声明。介于和之间的是一种表达。letlocalinendletinend

不同于local,let是一个表达式,而表达式的值是和let之间的表达式的值。inend

因为在您的情况下,您在inand之间有一个表达式end(并且您希望函数评估该表达式的结果),您需要使用let,而不是local

于 2010-11-28T14:20:52.100 回答