x, f x, f (f x) 的惰性列表,
Lazy list of x, f x, f (f x),
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
函数应该 return 一对?为什么列表的类型应该是 'a LazyList.t
?元素的类型不应该与 next
函数的参数类型相同吗?功能的描述并没有让我清楚地回答。
万一它有用,我想做的事情的概念来自 Clojure 的 iterate
。在 Clojure 中,我可以这样创建上面的定义:
(def nat-nums (iterate (fn [n] (+ n 1)) 0))
传递给 from_loop
的函数必须 return 一对。该对的第一个元素是您想要 return 的值。该对的第二个元素是稍后计算 next 元素所需的状态。
您的代码:
(fun n -> n + 1)
只是计算惰性列表的下一个元素,它不会return下一次调用所需的状态。需要这样的东西:
(fun n -> (n, n + 1))
(这将 return 一个以 0 开头的列表,我认为这就是你想要的。)
此公式比您的 clojure 示例更灵活,因为它允许您维护与 returned 值不同的任意状态。在您为 from_loop
.
提供的类型中,状态的类型为 'b
我现在没有电池,所以无法尝试。但我认为基于类型是正确的。
原来我真正想要的功能是LazyList.seq
,而不是from_loop
。虽然 from_loop
有其用途,但 seq
更简单并且可以满足我的要求。唯一的技巧是你必须提供第三个参数,它是一个终止测试,当列表应该结束时 returns false。我想要一个无限列表。可以使用始终 returns true:
的终止函数来创建它
let nat_nums = seq 0 (fun n -> n + 1) (fun _ -> true);;
LazyList.to_list (LazyList.take 8 nat_nums);;
- : int list = [0; 1; 2; 3; 4; 5; 6; 7]
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
函数应该 return 一对?为什么列表的类型应该是 'a LazyList.t
?元素的类型不应该与 next
函数的参数类型相同吗?功能的描述并没有让我清楚地回答。
万一它有用,我想做的事情的概念来自 Clojure 的 iterate
。在 Clojure 中,我可以这样创建上面的定义:
(def nat-nums (iterate (fn [n] (+ n 1)) 0))
传递给 from_loop
的函数必须 return 一对。该对的第一个元素是您想要 return 的值。该对的第二个元素是稍后计算 next 元素所需的状态。
您的代码:
(fun n -> n + 1)
只是计算惰性列表的下一个元素,它不会return下一次调用所需的状态。需要这样的东西:
(fun n -> (n, n + 1))
(这将 return 一个以 0 开头的列表,我认为这就是你想要的。)
此公式比您的 clojure 示例更灵活,因为它允许您维护与 returned 值不同的任意状态。在您为 from_loop
.
'b
我现在没有电池,所以无法尝试。但我认为基于类型是正确的。
原来我真正想要的功能是LazyList.seq
,而不是from_loop
。虽然 from_loop
有其用途,但 seq
更简单并且可以满足我的要求。唯一的技巧是你必须提供第三个参数,它是一个终止测试,当列表应该结束时 returns false。我想要一个无限列表。可以使用始终 returns true:
let nat_nums = seq 0 (fun n -> n + 1) (fun _ -> true);;
LazyList.to_list (LazyList.take 8 nat_nums);;
- : int list = [0; 1; 2; 3; 4; 5; 6; 7]