Scheme 重新排列球拍中的流

Scheme 重新排列球拍中的流,scheme,racket,Scheme,Racket,我想编写一个过程,将一个流(数据流)中的项目重新排列为另一个流(订单流)指定的顺序,该顺序由指定所需顺序的项目编号组成 例如,如果数据流以4、13、2、8开头,订单流以3、1、4、2开头,那么结果流将以2、4、8、13开头。(结果的第一项是数据的第三项,结果的第二项是数据的第一项,依此类推。) 我到目前为止 (define (reorder order-stream data-stream) (cond ((stream-null? order-stream) the-empty-s

我想编写一个过程,将一个流(数据流)中的项目重新排列为另一个流(订单流)指定的顺序,该顺序由指定所需顺序的项目编号组成

例如,如果数据流以4、13、2、8开头,订单流以3、1、4、2开头,那么结果流将以2、4、8、13开头。(结果的第一项是数据的第三项,结果的第二项是数据的第一项,依此类推。)

我到目前为止

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


(define (stream-ref s n)
  (if (= n 0)
      (stream-car s)
      (stream-ref (stream-cdr s) (- n 1))))
但是,输出不是预期的。

使用球拍流

注意

(stream-ref data-stream (stream-first order-stream))
将使用订单流的第一个元素来挑选数据流的元素

还要注意的是,除非数据流支持随机访问,否则这将非常缓慢

#lang racket
(require racket/stream)

(define (reorder order-stream data-stream)
  (cond ((stream-empty? order-stream) empty-stream)
        (else (stream-cons (stream-ref data-stream (stream-first order-stream))
                           (reorder (stream-rest order-stream) data-stream)))))


(define ones (stream-cons 1 ones))

(define (stream-add s1 s2)
  (stream-cons (+ (stream-first s1) (stream-first s2))
               (stream-add (stream-rest s1) (stream-rest s2))))

(define fibonacci (stream-cons 1 (stream-cons 1 (stream-add fibonacci (stream-rest fibonacci)))))
(for/list ([x fibonacci] [n 10]) x)                  ; '(1 1 2 3 5 8 13 21 34 55)
(for/list ([x (reorder '(3 1 4 2 10) fibonacci)]) x) ; '(3 1 5 2 89)

stream ref
接受一个流
s
和一个索引
n
,但您用
数据流
调用它。另外,
cons-stream
只给出了一个参数,这令人惊讶。但是,如果我执行(重新排序顺序数据),我只能获得输出(2.#)。我在手术过程中有没有做错什么?如何正确打印输出流?