Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Scheme-测试参数是否为列表(正确或不正确)_List_Function_Arguments_Scheme - Fatal编程技术网

List Scheme-测试参数是否为列表(正确或不正确)

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

我对scheme非常陌生,我正在试图弄清楚如何定义一个函数来测试该函数的参数是否是一个列表,其中是否是一个合适的列表并不重要

我发现我需要检查参数是空列表还是成对的。我有空列表的情况下工作良好,但我不知道如何检查的一对。我刚开始使用prolog,所以我最初的想法是这样做:

(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)
    将以错误结束

  • 在Scheme中,您必须使用文字#t和#f来表示true和false

  • 缺点总是以“真”结尾

  • 它不会检查整个列表

  • 我会这样写这个过程:

    (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中,这是解决问题的正确方法,但是还有一些额外的要点要考虑。请看我的答案。