在 Dracket 中获取 #stream 作为输出
Getting #stream as an output in Drracket
给出了顺序和数据流,我需要根据order-stream
对数据进行排序。
#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
。这是我的编程任务,所以不要提供完整的代码,请提供一些提示。
Racket 有一个内置的 stream-cons
,您不小心调用了它,而不是您打算使用的 cons-stream
。
看看你有什么:
(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)
预计return?
然后你打电话给
(define order-stream (cons-stream 2 1))
order-stream
的 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)
写 combine-streams
(a.k.a。Haskell 中的 zipWith
)很简单。
在Racket中,一定要用完整的语言工作,其中define
是递归的,类似于letrec
(而不是let
),否则最后一个将无法工作(你能明白为什么吗?)。
给出了顺序和数据流,我需要根据order-stream
对数据进行排序。
#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
。这是我的编程任务,所以不要提供完整的代码,请提供一些提示。
Racket 有一个内置的 stream-cons
,您不小心调用了它,而不是您打算使用的 cons-stream
。
看看你有什么:
(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)
预计return?
然后你打电话给
(define order-stream (cons-stream 2 1))
order-stream
的 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)
写 combine-streams
(a.k.a。Haskell 中的 zipWith
)很简单。
在Racket中,一定要用完整的语言工作,其中define
是递归的,类似于letrec
(而不是let
),否则最后一个将无法工作(你能明白为什么吗?)。