Stream 将#流作为Drracket中的输出获取

Stream 将#流作为Drracket中的输出获取,stream,scheme,racket,Stream,Scheme,Racket,给出了顺序流和数据流,我需要根据顺序流对数据进行排序 #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

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

#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)))))

当我执行
(重新排序订单流数据流)
时,我将
#stream
作为输出,而不是
6#承诺
。这是我的编程任务,所以请给出一些提示,而不是完整的代码

Racket有一个内置的
流cons
,您无意中调用了它,而不是您打算使用的
流cons

看看您有什么:

(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)))
什么样的东西
(流cdr-stream)
应该返回

然后你给我打电话

(define order-stream (cons-stream 2 1))
什么是
订单流
cdr


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

(define (partial-sums xs init)
    (cons-stream init 
         (partial-sums (stream-cdr xs)
                       (+ (stream-car xs) init))))
我们可以很容易地将
+
抽象为一般的二进制操作参数:

(define (scanl + xs init)
    (cons-stream init 
              (scanl + (stream-cdr xs)
                       (+ (stream-car xs) init))))
并称之为,例如

(define factorials (scanl * integers 1))
另一个有趣的定义
scanl
的方法是

(define (scanlist + xs init)
   (define rs (cons-stream init 
                (combine-streams + xs rs)))
   rs)
编写
combinestreams
(又称Haskell中的
zipWith
)是一件简单的事情


在Racket中,一定要使用完整的语言,其中
define
是递归的,类似于
letrec
(而不是
let
),否则最后一个将不起作用(你能明白为什么吗?)

当我使用cons-stream时,我会得到类似stream-ref:contract-invalization-expected:stream这样的错误?给定:'(5.#)@sageArt您没有在整个代码中完全替换。但还有其他问题。订单流是一个数字流,如2 3 4 1。。。。这些数字是数据流的顺序,例如5 6 7 8。。。输出将为6781。。这是重新排序的表格。。。。。。所以订单流的cdr在这种情况下是3不,它不是,正如所写的<代码>(cons流21)=(cons 2(延迟1))='(2.1)
。这不是一条小溪
(cons2(延迟空流))
是一个流:它的
流cdr
是一个流<代码>1
不是流。查看
重新排序的定义。突出显示的片段表示流的
stream cdr
必须是一个流。哦,我现在明白了,我对重新排序的定义是正确的,但是我创建的流是错误的,你能告诉我创建包含更多元素的流的方法吗。使用cons似乎更乏味。。谢谢您的帮助祝您过得愉快是的,只需为自己编写一个函数
列表来流
。这很容易。要创建一个无限流,请生成一些专门的函数,如:x d=x,x+d,x+d+d,…
;同样流行的还有
部分和
(或将
+
抽象为一般运算参数),以及Haskell的
迭代fx=x,f(x),f(f(x)),…
。考虑一下投票,并接受帮助你最多的答案。接受给你+2个代表,在代表15时,你可以对答案进行投票。:)