#ocaml
#ocaml
Вопрос:
Я только недавно начал изучать OCaml, и у меня небольшая проблема
Я пытаюсь сгенерировать ряд чисел с помощью следующей функции
let new_num =
let cpt = ref (-1) in
fun () -> incr cpt; Printf.sprintf "__number_%i" !cpt
Когда я запускаю ocaml
терминал, я могу получить число с чем-то вроде:
let n = new_num()
Но когда я добавляю вышеупомянутую функцию в существующий файл (который работает, только что предоставленный мне) и пытаюсь вызвать его следующим образом, я получаю сообщение об ошибке в строке, содержащей вызов new_num
функции
let matching_function i = match i with
| case1 -> ... (* a code that works fine*)
| C(e,s1,s2)->
let n1 = new_num() in
n1
let n2 = new_num() in
n2
let code_e = trl e in (* trl is a working function somewhere else in my code)
code_e
(* rest of code and print n1,n2*)
если я удалю следующую часть и запущу файл, все будет работать отлично.
let n1 = new_num() in
n1
let n2 = new_num() in
n2
Я не понимаю, почему это работает в интерпретаторе терминала, но не тогда, когда я запускаю его в файле .ml? Может кто-нибудь, пожалуйста, объяснить мне это и помочь правильно вызвать его? (извините за вопрос новичка)
Ответ №1:
Код в файле синтаксически некорректен, вот и все, что происходит.
У вас не может быть этого:
let n1 = new_num () in n1
let ...
Второй let
синтаксически недопустим на этом этапе.
Вы почти наверняка хотите что-то вроде этого:
let n1 = new_num () in
let n2 = new_num () in
...
Это определяет n1
и n2
для последующего использования в коде.
Причина, по которой это работает в интерпретаторе, заключается в том, что вы не вводите этот же код.
Вот что вы на самом деле видите, если вы вводите ошибочные строки в верхний уровень (интерпретатор):
# let n1 = new_num () in n1
let n2 = new_num () in n2;;
Error: Syntax error
Если вы добавляете ;;
между двумя строками, это принимается (хотя на самом деле это не определяет значения верхнего уровня с именем n1
и n2
). Но это не тот же код. ;;
Имеет синтаксический эффект.
В качестве дополнительного комментария это выражение:
let n1 = new_num () in n1
в точности эквивалентно этому выражению:
new_num ()
В частности, он не определяет значение n1
, которое вы можете использовать позже. Область определения v
in let v = e1 in e2
справедлива e2
.