【发布时间】:2017-04-30 05:39:32
【问题描述】:
Batteries.LazyList 允许定义惰性列表。我想定义一个惰性列表,由x、f x、f (f x)、f (f (f x))等组成。
根据模块文档中的 cmets,看来 from_loop 是我想要的功能:
“from_loop data next 从将next 应用到data,然后应用到结果等的连续结果中创建一个(可能是无限的)惰性列表。”
这个描述表明,如果我想要一个非负整数的惰性列表,例如,我可以这样定义它:
let nat_nums = from_loop 0 (fun n -> n + 1)
但是,这失败了,因为from_loop 的签名是
'b -> ('b -> 'a * 'b) -> 'a LazyList.t
所以next 函数具有签名('b -> 'a * 'b)。在 utop 中,错误消息下划线 n + 1 并说
Error: This expression has type int but an expression was expected of type 'a * int
我不明白'a 应该是什么。为什么next 函数应该返回一对?为什么列表的类型应该是'a LazyList.t?元素的类型不应该与next 函数的参数类型相同吗?函数的描述并没有让我明白答案。
如果它有帮助,我对我正在尝试做的事情的概念来自 Clojure 的 iterate。在 Clojure 中,我可以像这样创建上述定义:
(def nat-nums (iterate (fn [n] (+ n 1)) 0))
【问题讨论】:
标签: ocaml lazy-sequences ocaml-batteries