List Scheme-测试参数是否为列表(正确或不正确)
我对scheme非常陌生,我正在试图弄清楚如何定义一个函数来测试该函数的参数是否是一个列表,其中是否是一个合适的列表并不重要 我发现我需要检查参数是空列表还是成对的。我有空列表的情况下工作良好,但我不知道如何检查的一对。我刚开始使用prolog,所以我最初的想法是这样做:List Scheme-测试参数是否为列表(正确或不正确),list,function,arguments,scheme,List,Function,Arguments,Scheme,我对scheme非常陌生,我正在试图弄清楚如何定义一个函数来测试该函数的参数是否是一个列表,其中是否是一个合适的列表并不重要 我发现我需要检查参数是空列表还是成对的。我有空列表的情况下工作良好,但我不知道如何检查的一对。我刚开始使用prolog,所以我最初的想法是这样做: (define list? (lambda (ls) (if (or (eq? ls (quote())) (cons(car(ls) cdr(ls)))) true f
(define list?
(lambda (ls)
(if (or (eq? ls (quote()))
(cons(car(ls) cdr(ls))))
true false)))
(define list?
(lambda (ls)
(if (null? ls)
#t
(and (pair? ls)
(list? (cdr ls))))))
我的想法是,如果scheme可以将参数car和cdr结合起来,那么它必须是一对,并且它将返回true。否则它就会失败
但是,传递参数“(1 2)会产生以下结果:
(list? '(1 2))
. . application: not a procedure;
expected a procedure that can be applied to arguments
given: (1 2)
arguments...: [none]
我真的不明白这里发生了什么。此外,我觉得我的想法是如何使这个功能是有缺陷的,但我真的不知道如何纠正它
编辑:问题是(如果…)正在从cons中查找布尔值吗?您的想法正确!但代码不起作用的主要原因是,在第四行中,括号错误。这是您代码的正确转录:
(define list?
(lambda (ls)
(if (or (eq? ls (quote()))
(cons (car ls) (cdr ls)))
#t #f)))
但我认为这种解决方案不好,原因如下:
car
或cdr
时会出现错误。
例如:(1234)
将以错误结束(define list?
(lambda (ls)
(if (or (eq? ls (quote()))
(cons(car(ls) cdr(ls))))
true false)))
(define list?
(lambda (ls)
(if (null? ls)
#t
(and (pair? ls)
(list? (cdr ls))))))
让我们在一个例子上试试:(3.4)
。它只是一对,而不是一个列表
ls
是(3.4)。它是空的吗?否,然后继续第二个if分支和
中继续,并使用4递归调用list?
ls
为4
。它是空的吗?否。再次,继续第二个分支#f
tfw当我发现有一对?空的呢?在StudieEP中,这是解决问题的正确方法,但是还有一些额外的要点要考虑。请看我的答案。