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