为什么只需要在有限的流中迭代就不会停止该程序?

时间:2019-04-14 21:07:17

标签: ocaml

我试图通过在LearnOcaml中运行这些代码来获取两位数的质数列表。如果我将listify方法的参数(从流返回的列表)限制为小于20,则会编译代码。否则,它永远不会停止或返回“ Exception:Js_of_ocaml__Js.Error _”。我认为代码在语义上没有错。所以我 想知道是否有人可以帮助解决问题?

awk '{print $1,$2,$3}'

1 个答案:

答案 0 :(得分:0)

似乎filterStr在尝试创建代表21号之后的下一个元素的StrCons时正在循环。由于只有21个2位数的质数,因此它将永远循环。

请注意,当以n = 0调用listify时,StrCons已经被构造;只是没有被检查。但是这种情况下的StrCons有所不同(OCaml是一种严格的语言)。

使用此版本的listify,您可以使工作正常:

let rec listify s n =
  if n = 0 then []
  else
    match s with
    | Eos -> []
    | StrCons (q, w) ->
        if n = 1 then [q] else q :: listify (w ()) (n - 1)