【问题标题】:OcamL lazy list series generatingOcamL惰性列表系列生成
【发布时间】:2018-05-19 11:11:01
【问题描述】:

我对这个任务有疑问:

  • 定义惰性列表 lSpec (Ocaml),其中包含一个 1、两个 2、三个 3 等 1,2,2,3,3,3,4,4,4,4,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 转换为创建的不是整数系列,而是我任务中的系列。但我不知道是否有一些模式可以创建这样的系列?

提前感谢您的帮助。

【问题讨论】:

    标签: ocaml lazy-evaluation lazylist


    【解决方案1】:

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

    你可能会考虑这样的事情:

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

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

    【讨论】:

    • 我应该使用一些匹配还是 if 指令,因为我仍然无法找到解决方案?
    • 您应该测试jk 的相对值(假设您遵循我的建议)。为此,您可以使用 if 表达式。 (注意,OCaml 中的if 是一个有值的表达式。)
    • 有没有办法在 if 表达式中将 k 值设置为零,同时它被递增到例如 3?
    • OCaml 变量是不可变的,因此您无需设置它们。但是当你进行递归调用时,你可以传递任何你喜欢的值。
    • 好的,我设法做这样的事情:let rec lspecfrom (j,k) = if (j>k) then LCons (j, function () -> lspecfrom (j,k+1)) else LCons (j+1, function () -> lspecfrom (j+1,1));; 它正在工作,但你能告诉我它是否看起来还可以吗?感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多