不使用线程,OCaml计数器不会终止

时间:2019-02-02 10:44:47

标签: multithreading functional-programming ocaml counter

我有以下代码:

$json = '//RETURNED JSON';
$all_files = json_decode($json);

foreach($all_files->items as $files){
    echo $files->title;
    echo $files->selfLink;
    echo $files->mimeType;
}

它应该只输出从0到n的所有数字。需要澄清的是,我知道有一些更简单的方法可以达到相同的结果,但是我想知道为什么在这种特定情况下它不起作用。 当我使用某些参数运行此代码时,例如。 let counter n = let rec count i = if i > n then () else print_int i; count (i+1) in count 0 不会终止。

当我将代码counter 5的最后一行更改为in count 0时,它将输出in Thread.create count 0

有人可以解释这种行为吗?

编辑

还发现,如果您将代码修改为此:

012345

它工作正常。为什么会这样?

1 个答案:

答案 0 :(得分:3)

您的缩进有误导性;您的代码可以

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中的“使用开始...结束”。