【问题标题】:“mcar: expects argument of type <mutable-pair>; given ()” in member-like function“mcar:需要 <mutable-pair> 类型的参数;给定()”在类成员函数中
【发布时间】:2013-10-22 14:37:17
【问题描述】:
(define fun3
  (lambda (item list) 
    (cond ((equal? item (car list))) 
          ((fun3 item (cdr list)))
          (else #f))))

如果我输入一个不在列表中的元素,我想知道什么是错误的。那里显示一个错误。--mcar: expects argument of type &lt;mutable-pair&gt;; given ()

【问题讨论】:

  • 我输入 (fun3 'w (list 'a 'b )) 来执行这个,但它显示错误如上所述。否则,如果它找到了元素,则没有错误。

标签: list function scheme boolean racket


【解决方案1】:

如果您在球拍中使用可变列表/对,您必须记住,它是与常规列表完全分开的数据类型,您使用 () 语法。 当您通过调用“请求”库处理可变数据时: (请求方案/mpair)
您现在必须切换到使用该库中的相应过程 - mcar、mcdr、mpair、mlist、mcons 在构造对、谓词等时。否则无法从“mcons”接收和出错。 http://docs.racket-lang.org/reference/mpairs.html

【讨论】:

    【解决方案2】:

    当您到达列表末尾时会发生什么?像(1 2 3) 这样的列表实际上是一个 cons 单元链:

    (1 2 3) == (1 . (2 . (3 . ())))
    

    您使用car 获得. 左侧的东西,使用cdr 获得右侧的东西。考虑一下当您使用代码在 (1 2 3) 中搜索 4 时会发生什么:

    (define fun3
      (lambda (item list) 
        (cond ((equal? item (car list))) 
              ((fun3 item (cdr list)))
              (else #f))))
    

    最终你会递归到item 是(仍然)4,而list(3 . ()) 的情况。现在,(fun3 item (cdr list)) 将被调用,然后item 将(仍然)是4,但list 将是()。你不能打电话给(car ()) 因为() 不是一个缺点细胞。您需要明确检查list 是空列表的情况:

    (define fun3
      (lambda (item list) 
        (cond ((null? list) <...>)
              ((equal? item (car list))) 
              ((fun3 item (cdr list)))
              (else #f))))
    

    现在,有两点需要注意:

    1. 这可以大大简化。使用一些布尔逻辑,您甚至可以完全摆脱cond(有关如何操作的一些想法,请参阅Scheme, search if a word is a part of list)。这里的一般观点是你正在做一些类似于 C 代码的事情

      if ( condition ) {
        return false;
      }
      else {
        return true;
      }
      

      可以大大简化为return !condition;。您看到您的代码与此相似吗?特别是,您的第二种情况是(fun3 item (cdr list))。如果它是真的,那么你返回真。如果它是假的,那么你去下一个案例并......返回假。这意味着您可以简单地返回 (fun3 item (cdr list)) 的值。

    2. 更重要的问题是您说您要检查 item 是否是列表的元素或其任何子列表,但是您的代码现在(等待有关检查空列表)只检查item 是否是list 的成员,而不是它的任何子列表。当item 不等于(car list) 时,可能是因为(car list) 是另一个列表,您需要递归到并检查item 是否在其中。查看search through nested list in scheme to find a number 可能会对您有所帮助,但它不会确切地告诉您如何做到这一点。

    【讨论】:

    • 非常感谢朋友。有我的错。会记住的。
    猜你喜欢
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多