Stream Ocaml:惰性列表
我如何制作一个表示一系列双倍数字的惰性列表?例如:Stream Ocaml:惰性列表,stream,ocaml,lazy-evaluation,Stream,Ocaml,Lazy Evaluation,我如何制作一个表示一系列双倍数字的惰性列表?例如: 1 2 4 8 16 32 伟大的博客Enlicated mind有一篇关于这个主题的伟大文章: 你也可以退房 这是处理此问题的标准库 这个问题与这个问题也很相似: 使用流: let f x = Stream.from (fun n -> Some (x * int_of_float (2.0 ** float_of_int n))) 或 使用自定义的lazy\u列表键入: type 'a lazy_list = | Nil
1 2 4 8 16 32
伟大的博客Enlicated mind有一篇关于这个主题的伟大文章: 你也可以退房 这是处理此问题的标准库 这个问题与这个问题也很相似: 使用流:
let f x = Stream.from (fun n -> Some (x * int_of_float (2.0 ** float_of_int n)))
或
使用自定义的lazy\u列表
键入:
type 'a lazy_list =
| Nil
| Cons of 'a * 'a lazy_list lazy_t
let rec f x = lazy (Cons (x, f (2*x)))
如果您想手工完成,我想说您必须选择以下主要选项:
- 使用自定义的
类型,如ephemient所说(除了他的解决方案有点失败外):lazy\u列表
- 使用一种thunk(比如用一种不支持惰性计算的语言实现惰性计算)。您将列表定义为一个函数
,它说明如何从当前元素中获取下一个元素(无需使用流)。例如,要定义所有自然整数的列表,可以执行以下操作unit->'a
如果你这样做的话let make_lazy_list initial next = let lazy_list current () = let result = !current in current := (next !current); result in lazy_list (ref initial) let naturals = make_lazy_list 0 (function i -> i + 1)
您将获得以下输出:print_int (naturals ()); print_int (naturals ()); print_int (naturals ())
0 1 2
在我的核心基础上还有一个懒惰列表模块,叫做<代码> CFSeq < /代码>。事实上,我写了一整段函数数据结构。这一切都可以在2条款BSD许可下使用。享受
更新:代码已重命名为“”,现在托管在BitBucket上。您也可以使用该软件包。您是指惰性列表的特定实现,还是仅指一般概念?此外,您是否真的需要惰性列表(值一旦计算,就会被存储),或者您真的只是想要一个流(值不会被存储,因此只能读取一次)?我的
惰性列表的哪个部分被破坏了?我在编写它的时候没有测试它,我肯定比OCaml更熟悉Haskell和SML,但我刚刚测试了它,它在OCAML3.11.1上运行。Streams主要是因为OP在询问Streams的问题中添加了一条评论。Woops,你是对的,我真的误解了。。。另外,我没有看到关于使用流的评论。下次我会戴上眼镜:s。第一个链接不再工作了,他们移动了主机吗?@Oleg看起来域名过期了。这就是互联网上的生活。这个答案现在已经有将近8年的历史了:)电池库现在有了不同的属性。第一个链接,在archive.org上:
print_int (naturals ());
print_int (naturals ());
print_int (naturals ())
0
1
2