вложенные локальные декларации в ML Нью-Джерси - PullRequest
7 голосов
/ 28 ноября 2010

Привет всем У меня есть этот фрагмент кода:

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 раз, но каждый раз, когда я получаю сообщение об ошибке: </p>

- 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

кажется, что мои вложенные локальные объявления неверны, может кто-нибудь объяснить, почему?

1 Ответ

20 голосов
/ 28 ноября 2010

Существует два способа определения локальных функций и переменных в SML: local ... in ... end и let ... in ... end.

Разница между local и let заключается в том, что при local то, что находится между in и end - это одно или несколько объявлений переменных или функций.При let между in и end находится выражение.

В отличие от local, let является выражением, а значение let выражением является значением выражения.между in и end.

Поскольку в вашем случае у вас есть выражение между in и end (и вы хотите, чтобы функция вычисляла результат этого выражения), вам необходимоиспользуйте let, а не local.

...