Scheme returning wrong type to apply for list input
我正在尝试编写一个程序,该程序将在列表中添加数字。但是,当我将输入作为列表给出时,Scheme不会给我输出。
我的代码如下:
1 2
| (define (sumlist lst)
(cond ( (pair? lst) (+ (car lst) (sumlist(cdr lst))) ))) |
为什么会这样?我正在正确输入信息,即我在引用列表。
我提供的输入如下:
(sumlist '(1 2 3))
编辑:
我稍微改变了这个问题。该列表未在pair? 'lst中引用,这就是为什么我遇到错误的原因。
现在,我没有收到任何错误消息。但是,我也没有任何输出。
EDIT2:
我未引用pair? lst中的列表。但是,现在它给了我以下错误:arg2中的类型错误#
我已经相应地更新了代码。
- 我不认为您了解方案语法中函数应用程序的表示方式。那应该是(car lst)和(sumlist (cdr lst))。
-
(pair? 'lst)看起来很可疑...
-
@leppie也是。奇怪的是,直到片刻前它是(pair? lst) a," OP编辑了问题。
-
我做了你的建议。现在错误消失了。但是,我没有得到任何输出。
-
您不会收到错误,因为(pair? 'lst)始终为false,因此sumlist始终返回#<void>。
您的函数应用程序语法错误。功能应用程序始终是Scheme中的前缀,即car(lst)应该为(car lst)等。
同样,(pair? 'lst)是错误的,因为您不应该引用该参数。这将测试符号lst是否为一对,这显然总是错误的。
当您不想递归时(当您收到空列表时),您需要一个基本情况,该情况应返回0。
将所有这些放在一起,您应该具有以下内容:
1 2 3 4
| (define (sumlist lst)
(if (pair? lst)
(+ (car lst) (sumlist (cdr lst)))
0)) |
(我也将cond更改为if,因为在这种情况下不需要cond。)
- 为什么需要基本案例? Scheme不返回最后计算出的表达式的值吗?因此,即使我没有提到基本情况,当条件pair? lst变为false时,Scheme也会返回最后一个表达式。不会吗
-
@RohitShinde首先,这没有任何意义,因为它将返回#f,该数字不能添加到数字中。第二,它不能像cond那样工作,因为cond扩展为if形式,并且if是一种特殊形式。具体来说,如果没有条件匹配,则没有else子句的cond将返回#<void>。