【问题标题】:Scheme returning wrong type to apply for list inputScheme返回错误类型申请列表输入
【发布时间】:2015-02-09 05:09:14
【问题描述】:

我正在尝试编写一个在列表中添加数字的程序。但是,当我将输入作为列表提供时,Scheme 不会给我输出。

我的代码如下:

(define (sumlist lst)
    (cond ( (pair? lst) (+ (car lst) (sumlist(cdr lst))) )))

为什么会这样?我正在正确地提供输入,即我正在引用列表。

我给出的输入如下: (sumlist '(1 2 3))

编辑: 我稍微改变了问题。 pair? 'lst 中没有引用该列表,这就是我收到错误的原因。 现在,我没有收到错误。但是,我也没有得到任何输出。

编辑2: 我在pair? lst 中取消引用列表。但是,现在它给了我以下错误: arg2 中的类型错误 # 我已经相应地更新了代码。

【问题讨论】:

  • 我认为您不了解函数应用程序是如何在方案语法中表示的。那应该是(car lst)(sumlist (cdr lst))
  • (pair? 'lst) 看起来很可疑...
  • @leppie 那也是。奇怪的是,直到几分钟前还是(pair? lst)——OP 编辑​​了这个问题。
  • 我按照你的建议做了。现在错误消失了。但是,我没有得到任何输出。
  • 您没有收到错误,因为(pair? 'lst) 始终为假,因此sumlist 始终返回#<void>

标签: scheme lisp


【解决方案1】:
  1. 您的函数应用程序语法错误。函数应用在Scheme中是always前缀,即car(lst)应该是(car lst)
  2. 另外,(pair? 'lst) 是错误的,因为您不应该引用该论点。这将测试符号 lst 是否是一对,这显然总是错误的。
  3. 当您想要递归时(当您收到空列表时)需要一个基本案例,它应该返回0

把所有这些放在一起,你应该有这个:

(define (sumlist lst)
  (if (pair? lst)
      (+ (car lst) (sumlist (cdr lst)))
      0))

(我还将cond 更改为if,因为在这种情况下不需要cond。)

【讨论】:

  • 为什么我需要一个基本案例? Scheme 不返回计算的最后一个表达式的值吗?所以即使我没有提到基本情况,当条件pair? lst 变为假时,Scheme 也会返回最后一个表达式。不会吗?
  • @RohitShinde 首先,这没有任何意义,因为这将返回#f,它不能添加到数字中。其次,它不适用于cond,因为cond 扩展为if 形式,而if 是一种特殊形式。具体来说,如果没有条件匹配,则没有 else 子句的 cond 将返回 #<void>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2021-04-15
相关资源
最近更新 更多