>:期望一个真实的,给定的(无效)

>: expects a real, given (void)

我目前正在努力创建一个列表,以查找列表中的所有数字是否彼此相等:

(define (list-all-equal lon) (cond [(empty? lon) lon]
                                  [(empty? (rest lon)) (first lon)]
                                  [(empty? (rest (rest lon))) (first lon)]
                                  [(equal? (first lon) (list-all-equal(rest lon))) (write #true)]
                                  [(> (first lon) (list-all-equal(rest lon))) (write #false)]
                                  [(< (first lon) (list-all-equal(rest lon))) (write #false)]
                                  [else (list-all-equal (rest lon))]))

但是,我不断收到错误消息:>: expects a real, given void。有没有办法解决这个错误?

问题是你调用 write 作为递归的一部分,并且 write "returns" void,这将导致类似这个:

(> some-number (void))

切勿使用 write 到 return 程序中的值!我们想要 return 结果,而不是 在控制台上显示 结果。对于这种情况,您必须以这样的方式实现您的程序,如果它找到不同的数字,它就会停止比较——结果是错误的,我们不应该继续。一个好的策略是传递第一个元素并将其余元素与其进行比较:

(define (list-all-equal lst)
  (if (empty? lst)
      #t
      (list-all-equal-helper (first lst) (rest lst))))

(define (list-all-equal-helper ele lst)
  (cond ((empty? lst) #t)
        ((not (= (first lst) ele)) #f)
        (else (list-all-equal-helper ele (rest lst)))))        

或者,我们可以使用 apply :)

(define (list-all-equal lst)
  (apply = lst))

无论哪种方式,它都按预期工作:

(list-all-equal '(1 2 3))
=> #f
(list-all-equal '(1 1 1))
=> #t

write 不是 return 值,因此当您与递归结果进行比较时,您最终将与“无”进行比较。

此外,你的函数应该return#true#false,而不是列表元素,并且将列表元素与递归结果进行比较没有多大意义。

我想你在解决问题之前就开始写代码了。
一个有用的开始方式是列出可能性。

  • 空列表的所有元素都相等
  • 单例列表的所有元素都相等
  • 如果列表至少有两个元素,并且第一个元素等于第二个元素,则所有元素都相等当且仅当其尾部的所有元素都相等
  • 否则至少有1个不等元素

已翻译:

(define (list-all-equal lon) 
    (cond [(empty? lon) #true]
          [(empty? (rest lon)) #true]
          [(equal? (first lon) (second lon)) (list-all-equal (rest lon))]
          [else #false]))