Scheme Petite格式中的流乘法
我有一些作业,我有点不知所措。给定一个自然数流,我应该能够生成一个新的流(流的两倍),其中所有元素都乘以2Scheme Petite格式中的流乘法,scheme,Scheme,我有一些作业,我有点不知所措。给定一个自然数流,我应该能够生成一个新的流(流的两倍),其中所有元素都乘以2 (define stream-of-natural-numbers (letrec ([produce (lambda (current-natural-number) (cons current-natural-number (lambda ()
(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))))))
因此,做你应该做的事情(假设)——即使用描述性名称(但不够描述性)——是让你首先陷入麻烦的原因
我认为这不是一件好事——但只要评论中清楚地描述了它们,我就不明白为什么会这样