List Scheme函数-获取一个原子和一个列表,并返回新列表,其中给定的原子实例将从给定列表中删除
此代码生成以下错误 car:需要类型为的参数;给定fList Scheme函数-获取一个原子和一个列表,并返回新列表,其中给定的原子实例将从给定列表中删除,list,scheme,List,Scheme,此代码生成以下错误 car:需要类型为的参数;给定f 您似乎正在使用交换的参数调用remover。如果你这样称呼它: (define (remover lst n) (cond ((null? lst) ()) ((eq? (car lst) n) (cdr lst)) (else (cons (car lst) (remover (cdr lst) n))))) (remover 'f '(a f c g f b)) 您将得到结果(a c g f b
您似乎正在使用交换的参数调用
remover
。如果你这样称呼它:
(define (remover lst n)
(cond ((null? lst) ())
((eq? (car lst) n) (cdr lst))
(else (cons (car lst) (remover (cdr lst) n)))))
(remover 'f '(a f c g f b))
您将得到结果(a c g f b)
由于要删除所有出现的f
,还必须将(cdr lst)
更改为(remover(cdr lst)n)
,如下所示:
(remover '(a f c g f b) 'f)
(define (remover lst n)
(cond ((null? lst) ())
((eq? (car lst) n) (remover (cdr lst) n))
(else (cons (car lst) (remover (cdr lst) n)))))
然后(卸除器(a f c g f b)'f)
也应产生预期结果(a c g b)
要切换remover
的参数,您必须在定义和递归调用中切换它们,如下所示:
(remover '(a f c g f b) 'f)
(define (remover lst n)
(cond ((null? lst) ())
((eq? (car lst) n) (remover (cdr lst) n))
(else (cons (car lst) (remover (cdr lst) n)))))
根据参数名判断,我假设
lst
应该是一个列表,而不是符号f
。操作car
仅适用于成对和列表,而不适用于符号。另外,n
是数值参数的典型名称,如5
,而不是列表。例如,使用(define(list ref lst n)…
很明显,列表是命名约定中的第一个参数,索引是第二个参数。这非常有用。有没有一种方法可以得到(除去器'f'(af-c-g-f-b))顺序的结果,就像(a-c-g-b)我是新手一样scheme@AmanieWickramanayake顺序由您在过程的参数列表中定义。您已经选择了lst
,然后像(define(remover lst n)…
那样编写时选择了n
。您可以选择名称和顺序。如果保留名称,则通过将其设置为(remover n lst)
来进行切换。您还需要通过切换函数的顺序来更新调用函数的位置。@AmanieWickramanayake我已经在答案中添加了如何切换参数的说明。好的!我现在完全明白了。非常感谢您@Sylvester和martin_joerg