首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Drracket中获取#流作为输出

在Drracket中获取#流作为输出
EN

Stack Overflow用户
提问于 2015-10-14 07:05:20
回答 2查看 437关注 0票数 2

给出了顺序流和数据流,我需要根据order-stream对数据进行排序。

代码语言:javascript
复制
#lang racket
(define the-empty-stream '())
(define (stream-car stream)
 (car stream))
(define-syntax cons-stream
 (syntax-rules ()
    ((cons-stream x y)
     (cons x (delay y)))))

(define (stream-cdr stream)
 (force (cdr stream)))
(define stream-null? null?)
(define (integers-starting-from n)
 (stream-cons n (integers-starting-from (+ n 1))))

(define integers (integers-starting-from 1))

(define order-stream (stream-cons 2 1))
(define data-stream (stream-cons 5 6))

(define (reorder order-stream data-stream)
 (cond ((stream-null? order-stream) the-empty-stream)
       ((stream-null? data-stream) the-empty-stream)
       (else (stream-cons (stream-ref data-stream 
                                      (stream-car order-stream))
                          (reorder (stream-cdr order-stream) data-stream)))))

当我执行(reorder order-stream data-stream)时,我得到#stream作为输出,而不是6 . #promise。这是我的编程任务,所以不要给出完整的代码,而是给一些提示。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-15 12:18:36

看看你拥有的:

代码语言:javascript
复制
(define (reorder order-stream data-stream)
                 ^^^^^^^^^^^^
 (cond ((stream-null? order-stream) the-empty-stream)
       ((stream-null? data-stream) the-empty-stream)
       (else (stream-cons (stream-ref data-stream 
                                      (stream-car order-stream))
                          (reorder (stream-cdr order-stream) data-stream)))))
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^

(define (stream-cdr stream)
 (force (cdr stream)))

(stream-cdr stream)预期会返回什么样的东西?

然后你给我打电话

代码语言:javascript
复制
(define order-stream (cons-stream 2 1))

order-streamcdr是什么?

流编程很有趣。例如,要计算流p-s [a,b,c...] = a, a+b, a+b+c, ...的部分和,我们可以编写

代码语言:javascript
复制
(define (partial-sums xs init)
    (cons-stream init 
         (partial-sums (stream-cdr xs)
                       (+ (stream-car xs) init))))

我们可以轻松地将+抽象为一个通用的二进制操作参数:

代码语言:javascript
复制
(define (scanl + xs init)
    (cons-stream init 
              (scanl + (stream-cdr xs)
                       (+ (stream-car xs) init))))

并称之为.

代码语言:javascript
复制
(define factorials (scanl * integers 1))

另一种定义scanl的有趣方法是

代码语言:javascript
复制
(define (scanlist + xs init)
   (define rs (cons-stream init 
                (combine-streams + xs rs)))
   rs)

编写combine-streams (a.k.a.zipWith是一笔直截了当的交易。

在Racket中,一定要使用完整的语言,其中define是递归的,类似于letrec (而不是let),否则最后一个语言就不能工作了(您知道为什么吗?)

票数 0
EN

Stack Overflow用户

发布于 2015-10-14 07:46:24

球拍有一个内置的stream-cons,你无意中调用了它,而不是你打算使用的cons-stream

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

https://stackoverflow.com/questions/33118736

复制
相关文章

相似问题

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