Batteries.LazyList允许定义惰性列表。我想定义一个包含x, f x, f (f x),f (f (f x))等 的惰性列表。
根据模块文档中的评论,这似乎from_loop是我想要的功能:
“从应用到from_loop data next的连续结果创建一个(可能是无限的)惰性列表,然后应用到结果等。”nextdata
这个描述表明,如果我想要一个非负整数的惰性列表,例如,我可以这样定义它:
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 'a LazyList.t?元素的类型不应该与函数参数的类型相同next吗?该功能的描述并没有让我清楚地知道答案。
如果它有帮助,我对我正在尝试做的事情的概念来自 Clojure 的iterate. 在 Clojure 中,我可以像这样创建上述定义:
(def nat-nums (iterate (fn [n] (+ n 1)) 0))