Petite方案中的流的乘法

时间:2016-05-22 12:06:50

标签: scheme

我得到了一些我有点迷失的功课。给定一个自然数字流,我应该能够生成一个新流(两次流),其中所有元素都乘以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)))
  

(两次流自然数字流)

我错过了什么?

1 个答案:

答案 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 据说不是一件好事 - 但只要在评论中清楚地描述它们,我就不明白为什么会这样。