大家好,我有这段代码:
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]&lt; -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
似乎我的嵌套本地声明是错误的,有人可以解释一下原因吗?
答案 0 :(得分:20)
有两种方法可以在SML中定义局部函数和变量:local ... in ... end
和let ... in ... end
。
local
和let
之间的区别在于local
in
和end
之间的差异是一个或多个变量或函数声明。使用let
in
和end
之间的内容是表达式。
与local
不同,let
是一个表达式,let
表达式的值是in
和end
之间表达式的值。
因为在你的情况下,你有in
和end
之间的表达式(并且你希望函数计算该表达式的结果),你需要使用let
,而不是local
。