使用 Racket 实现流时遇到问题

问题描述 投票:0回答:1

我正在利用晚上的空闲时间学习《编程向导书》的结构和解释。一切都很顺利,直到我在第三章尝试实现流。我使用的是(Dr)Racket,而不是Scheme,所以这可能是我的问题。

问题的症结在于,当我尝试创建流时,出现内存问题:“交互已禁用;内存不足”。这对我来说表明我使用延迟的方式有问题。

提前感谢您的任何建议:)

我已经尝试了文中建议的代码:

#lang racket (define (cons-stream a b) (cons a (delay b))) (define (car-stream s) (car s)) (define (cdr-stream s) (force (cdr s)))
我称之为 Racket 的延迟和力量。我也尝试过实现延迟并强迫自己遵循文本,但我遇到了相同的内存错误。

为了测试这一切是否有效,我尝试编写无限的 1 流:

(define (ones) (cons-stream 1 (ones)))
并且间隔非常大:

(define (interval low high) (if (> low high) null (cons-stream low (interval (+ low 1) high)))) (define (first-integers n) (interval 0 n)) (define test-interval (first-integers 10000000000000000000000000))
根据我对文本的理解,这些都不会引起问题,因为我们只在需要时生成流。然而,我所做的事情导致了内存问题,所以我认为代码尝试生成整个流!

stream racket lazy-sequences
1个回答
0
投票
我们无法定义

(define (cons-stream a b) (cons a (delay b)))
因为 

define

 创建了一个函数 
cons-stream
,因此在每个函数调用中,所有参数都将在调用之前进行评估。这违背了整个目的——
b
将已经被评估。

另请参阅

延迟是如何实现的?.

© www.soinside.com 2019 - 2024. All rights reserved.