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)))

如果您想手工完成,我想说您必须选择以下主要选项:

  • 使用自定义的
    lazy\u列表
    类型,如ephemient所说(除了他的解决方案有点失败外):

  • 使用一种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