Racket 流会记住它们的元素吗? [英] Do Racket streams memoize their elements?

查看:29
本文介绍了Racket 流会记住它们的元素吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在从无限流中计算大量数字时,Racket 是否使用记忆化?因此,例如,如果我打印出(也就是计算并显示)无限整数流上的前 400 个数字:(1 2 3 ... 399 400)就在我要求在这个无限流上打印前 500 个数字之后.第二组计算会使用记忆化吗?那么前 400 个数字不会再次计算?

Does Racket use memoization when computing large amounts of numbers from an infinite stream? So, for example, if I printed out (aka, computed and displayed) the first 400 numbers on the infinite stream of integers: (1 2 3 ... 399 400) And right after I asked to print the first 500 numbers on this infinite stream. Would this second set of computations use memoization? So the first 400 numbers would not be computed again?

或者这个功能是否需要由用户编码/从库中获得?

Or does this functionality need to be coded by the user/obtained from libraries?

推荐答案

内置 racket/stream 库使用惰性求值和记忆从流中绘制元素:

The built-in racket/stream library uses lazy evaluation and memoization to draw elements from a stream:

(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 执行了四个流操作,但只显示了两个绘制元素..."消息.

The expressions passed to stream-cons are not evaluated until requested either with stream-first or stream-rest. Once evaluated, they are memoized. Notice that despite the four stream operations performed on s, only two `"drawing element..." messages are displayed.

这篇关于Racket 流会记住它们的元素吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆