Scheme 方案:如何合并两个流

Scheme 方案:如何合并两个流,scheme,Scheme,我有这些函数 (define force! (lambda (thunk) (thunk))) (define stream-head (lambda (s n) (if (zero? n) '() (cons (car s) (stream-head (force! (cdr s)) (1- n)))))) (define make-stream

我有这些函数

(define force!
  (lambda (thunk)
    (thunk)))


(define stream-head
  (lambda (s n)
    (if (zero? n)
        '()
        (cons (car s)
              (stream-head (force! (cdr s))
                           (1- n))))))

(define make-stream
  (lambda (seed next)
    (letrec ([produce (lambda (current)
                        (cons current
                              (lambda ()
                                (produce (next current)))))])
      (produce seed))))



(define make-traced-stream
  (lambda (seed next)
    (letrec ([produce (trace-lambda produce (current)
                        (cons current
                              (lambda ()
                                (produce (next current)))))])
      (produce seed))))

(define stream-of-even-natural-numbers
  (make-traced-stream 0
                      (lambda (n)
                        (+ n 2))))

(define stream-of-odd-natural-numbers
  (make-traced-stream 1
                      (lambda (n)
                        (+ n 2))))
我需要做一个函数来合并最后两个,这样如果我运行

(stream-head (merge-streams stream-of-even-natural-numbers stream-of-odd-natural-numbers) 10)
我必须得到输出(01 2 3 4 5 6 7 8 9)。。这是怎么做到的

我最好的想法是,这是错误的:

(define merge-streams
  (lambda (x y)
    (cons (car x)
          (merge-streams y (cdr x)))))
这里有一个建议:

(define (merge-streams s1 s2)
  (cond
    [(empty-stream? s1) s2)] ; nothing to merge from s1
    [(empty-stream? s2) s1)] ; nothing to merge from s2
    [else (let ([h1 (stream-car s1)]
                [h2 (stream-car s2)])
            (cons h1 
              (lambda ()
                (cons h2 
                  (stream-merge (stream-rest s1) 
                                (stream-rest s2))))))]))

它使用了一些必须首先定义的帮助函数。

@chris对编辑感到抱歉(我没有注意到有一个)。@soegaard哦,没关系,只是我手工缩进了(包括
trace lambda
的正确语义含义),所以我宁愿保留它。:-)由于OP打算对结果调用
流头
,我觉得这应该生成一个流而不是一个列表。我添加了一个(lambda()…),以便将合并的流转换为流(我希望我得到了正确的表示)。我设法理解了您正在做的事情,并在那之后提出了我自己的解决方案<代码>(定义(合并流s1 s2)(cons(车辆s1)(延迟(合并流s2)(强制!(cdr s1‘‘‘‘)’)