首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >球拍流会回传它们的元素吗?

球拍流会回传它们的元素吗?
EN

Stack Overflow用户
提问于 2014-10-21 02:52:35
回答 3查看 1.1K关注 0票数 4

在计算无限流中的大量数字时,球拍是否使用回忆录?例如,如果我打印出(也就是,计算和显示)无限整数流上的前400个数字:(1,2,3. 399,400),就在我要求在这个无限流上打印前500个数字之后。第二组计算会使用回忆录吗?所以前400个数字就不会再被计算了?

或者该功能是否需要由用户/从库中获得?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-21 08:14:07

内置的拍子/流库使用惰性评估和回忆录从流中提取元素:

代码语言:javascript
运行
复制
(require racket/stream)

(define (print-and-return x)
  (displayln "drawing element...")
  x)

(define (in-range-stream n m)
  (if (= n m)
      empty-stream
      (stream-cons (print-and-return n) (in-range-stream (add1 n) m))))

(define s (in-range-stream 5 10))

(stream-first s)
(stream-first s)
(stream-first (stream-rest s))

传递给stream-cons的表达式在使用stream-firststream-rest请求之前不会进行计算。一旦经过评估,他们就会被回忆录。注意,尽管在s上执行了四个流操作,但只有两个`“绘图元素.”将显示消息。

票数 11
EN

Stack Overflow用户

发布于 2014-10-21 03:23:31

您可以使用memoize包。

GitHub来源:https://github.com/jbclements/memoize/tree/master

raco pkg install memoize

使用它就像用define替换define/memo一样简单。引用它的例子:

代码语言:javascript
运行
复制
(define (fib n)                                     
  (if (<= n 1) 1 (+ (fib (- n 1)) (fib (- n 2)))))  

> (time (fib 35))                                   
cpu time: 513 real time: 522 gc time: 0             
14930352                                            

> (define/memo (fib n)                              
    (if (<= n 1) 1 (+ (fib (- n 1)) (fib (- n 2)))))

> (time (fib 35))                                   
cpu time: 0 real time: 0 gc time: 0                 
14930352      

此外,通常很容易实现自己的回忆录使用球拍哈希表。

票数 5
EN

Stack Overflow用户

发布于 2014-10-21 13:16:35

对于其他使用SRFI 41流的方案实现,这些流也完全回溯所有的物化元素。

实际上,在我的SRFI 41的Guile端口(从2.0.9开始就使用了Guile ),流的默认打印机将打印出所有如此物化的元素(没有什么不是):

代码语言:javascript
运行
复制
scheme@(guile-user)> ,use (srfi srfi-41)
scheme@(guile-user)> (define str (stream-from 0))
scheme@(guile-user)> (stream-ref str 4)
$1 = 4
scheme@(guile-user)> str
$2 = #<stream ? ? ? ? 4 ...>

任何没有作为?...打印出来的元素都已经被回忆录,不会被重新计算。(如果您想知道如何实现这样的打印机,请看下面的诡计版本。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26478167

复制
相关文章

相似问题

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