我得到了一些我有点迷失的功课。给定一个自然数字流,我应该能够生成一个新流(两次流),其中所有元素都乘以2。
UICollectionView
我提出了以下代码,但似乎没有任何工作,我现在迷失了。
(define stream-of-natural-numbers
(letrec ([produce (lambda (current-natural-number)
(cons current-natural-number
(lambda ()
(produce (1+ current-natural-number)))))])
(produce 0)))
(两次流自然数字流)
我错过了什么?
答案 0 :(得分:1)
(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
不是一个函数,它是一个流 - 一对其当前数字和其流尾部。
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))))))
现在你可以看到你被过度暗示(以及未充分专注)命名弄糊涂了,将你当前的“当前”号码与“当前号码”混淆“功能和”下一个“流与”下一个流“功能。通过分解法术,现在很清楚需要做些什么来使两个produce
调用同步。
顺便提一下,如果您首先使用较短的变量名 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))))))
所以做你应该做的事情(据说) - 即使用描述性名称(但不够描述) - 是什么让你进入这个麻烦在第一位!
1 据说不是一件好事 - 但只要在评论中清楚地描述它们,我就不明白为什么会这样。