OcamL懒惰列表系列生成

时间:2017-12-05 17:41:27

标签: ocaml lazy-evaluation lazylist

我对此任务有疑问:

  • 定义懒惰列表lSpec(Ocaml)包含一个1,2,3,3,3等1,2,2,3,3,3,4,4,4,5,5 ......

到目前为止我已经:

type 'a llist = LNil | LCons of 'a * (unit -> 'a llist);;

let rec lfrom k = LCons (k, function () -> lfrom (k+1));; 

let rec ltake = function  
(0, _) -> []  
| (_, LNil) -> []  
| (n, LCons(x,xf)) -> x::ltake(n-1, xf()) ;;

此函数基于输入数字生成一系列整数,例如

ltake (5,lfrom 30);; 
- : int list = [30; 31; 32; 33; 34] 

我想要做的事情是将函数lfrom转换为不创建一系列整数,而是创建我的任务系列。但我不知道是否有一些模式来创建这样的系列?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您现在拥有的代码只使用一个值k来跟踪序列中的位置。从根本上说,这对于新问题来说已经足够了,但是只使用一个数字就会让事情难以跟踪。

您可能会考虑以下内容:

let rec lspecfrom (j, k) = . . .

j是您正在处理的数字(1,2,3,4,...),k是到目前为止已生成的数量。然后整个列表将通过电话lspecfrom (1, 0)生成。