Главное, что нужно осознать, - это два варианта использования let
.Первая форма используется для определения значений в модуле и должна отображаться на самом внешнем уровне модуля.Это выглядит так:
let name = expression
В качестве удобного синтаксиса вы можете определить функцию на самом внешнем уровне, например так:
let name arg = expression
Другая форма let
может появляться где угоднои используется для определения локальной переменной.Это выглядит так:
let name = expression1 in expression2
Это устанавливает name
как локальную переменную со значением, заданным expression1
.Область имени (где оно может использоваться): expression2
.
Опять же, в качестве удобного синтаксиса, вы можете определить локальную функцию следующим образом:
let name arg = expression1 in expression2
Это выглядитдля меня, например, auxListMaker
и auxTrueFlser
должны быть локальными функциями, определенными внутри restrict
.И trueFalseList
должно быть локальным (нефункциональным) значением.Таким образом, форма restrict
будет выглядеть примерно так:
let rec restrict (column, value, aTable) =
let auxTrueFalser (column, value, aTable) =
...
in
let auListMaker (vals, trueFalseList) =
...
in
let trueFalseList = auxTrueFalser (column, value, aTable) in
... (* body of restrict *)
В этом макете restrict
определяется на верхнем уровне (то есть просто с let
, без in
).Другие имена являются локальными переменными (значениями и функциями) и поэтому определяются с помощью let ... in
.
Также обратите внимание, что вы должны определить имя перед его использованием.В вашем коде имя auxListMaker
используется перед определением.В приведенном выше макете порядок в порядке.
Обновление
Ответы на дополнительные вопросы.
Область действия первой формы let
(без in
) - остальная часть модуля.В обычном случае простого исходного файла .ml это означает остальную часть файла.
Да, функция restrict
, показанная в приведенном выше схематическом макете, повторно оценит значение для trueFaleList
прикаждый рекурсивный вызов.
Если вы работаете в терминале, о котором OCaml знает, это подчеркивает место, где он считает, что у вас есть синтаксическая ошибка.Синтаксис первых нескольких строк приведенного выше схематического макета вполне понятен.Вам нужно будет показать свой код (или наименьшее автономное подмножество, которое показывает проблему) и конкретное сообщение об ошибке, которое вы получили.