Счетчик OCaml не завершается без использования потоков - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть следующий код:

let counter n = 
    let rec count i = 
    if i > n 
      then ()
      else 
          print_int i; 
          count (i+1)
    in count 0

Он должен просто вывести все числа от 0 до n.Чтобы уточнить, я знаю, что есть более простые способы достижения того же результата, но я хочу знать, почему он не работает в данном конкретном случае.Когда я запускаю этот код с некоторым параметром, например.counter 5 не заканчивается.

Вместо этого, когда я изменяю последнюю строку моего кода in count 0 на in Thread.create count 0, он выводит 012345

Может кто-нибудь объяснить это поведение?

РЕДАКТИРОВАТЬ

Также обнаружено, что если вы измените код так:

let counter n = 
    let rec count i = 
    if i > n 
      then ()
      else 
          let i = i
          in print_int i; 
          count (i+1)
    in count 0

, то он будет работать нормально.Почему это?

1 Ответ

0 голосов
/ 02 февраля 2019

Ваш отступник вводит в заблуждение;ваш код сначала

if i > n then () else print_int i; 

, а затем

count (i+1)

Конечно, он не заканчивается!То, что вы хотите, это

else begin
  print_int i; 
  count (i+1)
end

(или else ( ... )).См., Например, «Использование начала ... конца» в https://ocaml.org/learn/tutorials/if_statements_loops_and_recursion.html.

...