Проблема с вашим кодом в основном связана с вашим пониманием того, что делает let ... in
.
Когда вы набираете let x = ... in expr
, вы создаете новую переменную x
, которая будет применятьсяв вашем выражении expr
и только там. Это означает, что ваши два объявления ver
:
let ver = 1 in
...
let ver = if (nc < 51 && nc > 0 && pc < 9 && pc > 0 ) then 0 else 1 in
Они объявляют две разные переменные ver
, и только условие используется в условии вашего цикла while
(который будет бесконечным циклом). в результате).
Теперь к вашей синтаксической ошибке.
Как указал Джеффри, done
указывает на конец цикла. Это не выражение, а скорее закрывающие скобки. Однако let ... in
ожидает, что за ним последует выражение (где ваша переменная будет «существовать»). Это не то, что вам нужно, поскольку вы хотите, чтобы новое значение ver
выходило за пределы его области действия.
Быстрое и грязное решение
Вы можете объявить ver
ссылкой. Это значение, которое вы можете изменить в OCaml (по умолчанию все объявленные значения являются константами). Вы объявляете новую ссылку с ref
, назначаете ее с :=
и читаете ее с !
. Пример:
let ver = ref true in (* I switched to a boolean, you can easily go back to integer *)
while !ver do
(* ... *)
let b1 = int_of_string b1s in
ver := not (nc < 51 && nc > 0 && pc < 9 && pc > 0 )
done
Обратите внимание, что это не то, как разработчик OCaml обычно кодирует это, так как мы предпочитаем, чтобы наши переменные оставались неизменными и зацикливались, используя рекурсивную функцию.
Способ OCaml
Рекурсивные функции позволяют делать то, что делает любой цикл while
, в то же время давая вам синтаксический контроль над тем, что является изменяемым или нет.
let rec loop () =
(* ... *)
let b1 = int_of_string b1s in
if (nc < 51 && nc > 0 && pc < 9 && pc > 0 ) then () else loop ()
in loop ()
Обратите внимание, что ver
нетпеременная здесь, так как цикл напрямую вызывает себя, когда это необходимо. Если вы пытаетесь что-то вычислить, вы можете легко вернуть результат в предложении then
. Обратите внимание, что в моих кодах (и в вашем) ни одна переменная не выходит из цикла по умолчанию.