函数seq应该从init开始返回一个序列,并且每次都按步骤延伸,直到条件未被验证:
let rec seq init step cond () =
let r = ref init in
if cond !r
then Cons(step !r, seq !r step cond)
else Nil
我试过这些(to_list(seq 1 seq 1(fun x - > x + 1)(fun x - > x< 10))并且我有 评估期间堆栈溢出(循环递归?)。
答案 0 :(得分:4)
首先,你应该在没有充分理由的情况下避免使用引用。那么只需存储当前值而不是下一个值:
let rec seq current step cond () =
if cond current then
Cons(current, seq (step current) step cond)
else
Nil