правильный способ вызова функции в OCaml

#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 .