如何附加两个流?

时间:2015-05-31 19:28:32

标签: 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
  (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 (append-stream stream-of-even-natural-numbers stream-of-odd-natural-numbers) 4)

I get the output (0 2 1 3)

问题是,流是无限的,我不知道如何创建一个知道何时停止从第一个流中获取输入然后继续从最后一个输入的函数。

之前我制作了两个列表的合并,看起来像这样;

>  (define (merge-streams s1 s2)  (cons (car s1)  (delay (merge-streams
> s2 (force!(cdr s1))))))

(stream-head (merge-stream stream-of-even-natural-numbers stream-of-odd-natural-numbers) 10)
= (0 1 2 3 4 5 6 7 8 9)

在这里,我可以延迟,并替换每个列表中的哪个元素。

如何制作智能程序来附加列表?

2 个答案:

答案 0 :(得分:3)

var server = new TcpListener(IPAddress.Any, 51328);

server.Start();

var client = new TcpClient();

client.ConnectAsync(IPAddress.Parse("address from whatismyip"), 51328);

server.AcceptTcpClient(); // hangs indefinitely here

Console.ReadKey();

答案 1 :(得分:1)

根据您展示的内容,流只能是无限的。附加两个无限流很简单:

(define append-infinite-streams
  (lambda (s1 s2)
    s1))

如果你想要一个自适应的追加,根据通过stream-head调用它的方式报告不同的东西,那么用这组函数以及它们如何定义流的概念是不可能的。

即使你设法通过其他方案实现这一目标,这也是不明智的。流的较短前缀不应该始终是同一个流的较长前缀的一部分吗?但你似乎想要

(define s3 (stream-append s1 s2))

(stream-head s3 6) 
=> (0 2 4 1 3 5) 

(stream-head s3 8) 
=> (0 2 4 6 1 3 5 7)