Racket 流会记住它们的元素吗? [英] Do Racket streams memoize their elements?
问题描述
在从无限流中计算大量数字时,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-first
或 stream-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屋!