首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >懒惰列表x,f,f (f ),

懒惰列表x,f,f (f ),
EN

Stack Overflow用户
提问于 2017-04-30 05:39:32
回答 2查看 196关注 0票数 1

Batteries.LazyList允许定义延迟列表。我想定义一个由xf xf (f x)f (f (f x))等组成的惰性列表。

根据模块文档中的注释,from_loop似乎是我想要的函数:

"from_loop data next从应用nextdata,然后应用到结果的连续结果创建了一个(可能无限的)懒惰列表,等等。“

例如,这个描述表明,如果我想要一个非负整数的惰性列表,我可以这样定义它:

代码语言:javascript
复制
let nat_nums = from_loop 0 (fun n -> n + 1)

但是,由于from_loop的签名是

代码语言:javascript
复制
'b -> ('b -> 'a * 'b) -> 'a LazyList.t

因此,next函数具有签名('b -> 'a * 'b)。在utop中,错误消息将n + 1标记为“

代码语言:javascript
复制
Error: This expression has type int but an expression was expected of type 'a * int

我不明白'a应该是什么样子。为什么next函数应该返回一对?为什么列表的类型应该是'a LazyList.t?元素的类型不应该与next函数的参数类型相同吗?对这个函数的描述并没有给我清楚的答案。

如果这有帮助的话,我对我想要做的事情的概念来自Clojure的iterate。在Clojure中,我可以创建如下所示的上述定义:

代码语言:javascript
复制
(def nat-nums (iterate (fn [n] (+ n 1)) 0))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-30 05:44:54

传递给from_loop的函数必须返回一对。对的第一个元素是要返回的值。该对的第二个元素是稍后计算下一个元素所需的状态。

你的代码:

代码语言:javascript
复制
(fun n -> n + 1)

只要计算延迟列表的下一个元素,它就不会返回下一个调用所需的状态。这是我们想要的:

代码语言:javascript
复制
(fun n -> (n, n + 1))

(这将返回以0开头的列表,我认为这是您想要的。)

这个公式比clojure示例更灵活,因为它允许您维护与返回的值不同的任意状态。在您为'b提供的类型中,状态为from_loop类型。

我现在没有电池,所以我不能试试这个。但我认为从类型上看是正确的。

票数 2
EN

Stack Overflow用户

发布于 2017-11-10 05:08:34

原来我真正想要的函数是LazyList.seq,而不是from_loop。虽然from_loop有它的用途,但seq更简单,可以做我想做的事情。唯一的诀窍是,您必须提供第三个参数,这是一个终止测试,在列表应该结束时返回false。我想要一个无限的清单。您可以使用始终返回true的终止函数来创建该函数:

代码语言:javascript
复制
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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43703295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档