Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme Petite格式中的流乘法_Scheme - Fatal编程技术网

Scheme Petite格式中的流乘法

Scheme Petite格式中的流乘法,scheme,Scheme,我有一些作业,我有点不知所措。给定一个自然数流,我应该能够生成一个新的流(流的两倍),其中所有元素都乘以2 (define stream-of-natural-numbers (letrec ([produce (lambda (current-natural-number) (cons current-natural-number (lambda ()

我有一些作业,我有点不知所措。给定一个自然数流,我应该能够生成一个新的流(流的两倍),其中所有元素都乘以2

(define stream-of-natural-numbers
    (letrec ([produce (lambda (current-natural-number)
                  (cons current-natural-number
                        (lambda ()
                          (produce (1+ current-natural-number)))))])
(produce 0)))
我想出了下面的代码,但似乎没有什么工作,我现在迷路了

(define twice-the-stream
    (lambda (n)
        (letrec ([produce (lambda (current next)
                              (cons (* 2 current)
                                    (lambda ()
                                       (produce (current next) (force (next))))))])
  (produce (car n) (force (cdr n))))))
(自然数流的两倍)

我错过了什么

(define twice-the-stream
    (lambda (n)
        (letrec ([produce (lambda (current next)
                              (cons (* 2 current)
                                    (lambda ()
                                       (produce (current next) (force (next))))))])
                              ;; this is wrong: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  (produce (car n) (force (cdr n))))))
此时您已经强制执行了
(cdr n)
;现在
next
不是一个函数,它是一个流——它的当前编号和流尾的cons对

current
也不是一个函数。这是一个号码,已经被用来产生比那个电话高出一倍的号码

为了减轻认知负荷,重命名变量以提醒您它们是什么

(define twice-the-stream
    (lambda (numbers-stream)
        (letrec ([produce (lambda (current-num next-str)
                              (cons (* 2 current-num)
                                    (lambda ()
                                       (produce (current-element next-str)
                                                (force (next-elements next-str))))))])
  (produce (car numbers-stream) (force (cdr numbers-stream))))))
现在,您可以看到,您被过度暗示(并且没有进行专门化)的命名弄糊涂了,在您的头脑中,将“当前”数字与“当前数字”函数、以及“下一个”流与“下一个流”函数混为一谈。通过解除咒语,现在很清楚需要做什么才能使两个
产生
呼叫同步

顺便说一句,如果您首先使用较短的变量名称1,
ns
表示“一个数字流”,
n
表示“一个数字”,
s
表示“一个数据流”,您就不会那么容易混淆

(define twice-the-stream
    (lambda (ns)  ;; a numbers stream
        (letrec ([produce (lambda (n s)   ; a number, and a stream
                              (cons (* 2 n)   ; a number, doubled
                                    (lambda ()    ; a stream, repackaged:
                                       (produce (.... s)  ; _its_ 1st element
                                                (force (.... s))))))])  ; and the rest
  (produce (car ns) (force (cdr ns))))))
因此,做你应该做的事情(假设)——即使用描述性名称(但不够描述性)——是让你首先陷入麻烦的原因


我认为这不是一件好事——但只要评论中清楚地描述了它们,我就不明白为什么会这样