比较两个变量(如果我不知道它们的类型)

时间:2019-03-07 11:17:30

标签: functional-programming scheme

我正在学习Scheme,我想比较两个变量,但是我不知道每种变量都有哪种类型。

在此SO answer上,告诉何时使用=,eqv ?、等于?和eq ?,但我没有找到我想要的东西。

我的问题是,变量可能是:

  1. 列表:'(1 2)'((10) 2)
  2. 字符串:'sunny
  3. 编号:2

所以我可以将数字与列表进行比较,或者将列表与字符串进行比较。

我有此代码:

(define contains?
  (lambda (lst element)
    (cond
      [(null? lst) #f]
      [(equal? (car lst) element) #t]
      (else [(contains? (cdr lst) elements)]))))

我可以使用哪个运算符来比较其中两个变量?

2 个答案:

答案 0 :(得分:3)

如果要测试它们的平等,那么equal?是最好的选择,它是最通用的相等谓词,因此可用于多种数据类型,并进行递归比较对于列表,向量等的情况:

  

两个值相等吗?且仅当它们是eqv?时,除非为特定数据类型另外指定。

     

进一步指定是否等于的数据类型?包括字符串,字节字符串,对,可变对,向量,框,哈希表和可检查的结构。在后六种情况下,均等地定义了相等性。如果v1和v2都包含参考周期,则当值的无限展开相等时,它们相等。

答案 1 :(得分:0)

只需添加到奥斯卡奖的答案即可。对于数字,有特定于类型的过程,例如string=?char=?=,但一般而言,有3种:

  • eq?测试两个参数是否具有相同的值,如在同一时刻创建的参数或指针相等。
  • eqv?测试两个原始/标量/原子值在显示时是否看起来相同
  • equal?测试两个值是否相同

此外,保证{{1}的#teq?的{​​{1}}和#t的{​​{1}}可以保证是eqv?的{​​{1}}。

我读过完全跳过#t的书,只是将eqv?#t用作一般比较。相当多的东西比较程序具有全面的3种比较方法的3种版本。例如。 equal?eqv?),eq?equal?),memberequal?)。

关于memv:我们保证eqv?memqeq?和诸如eq?之类的符号的取值都相同时间,因此它们始终是指针相等的。其他值可能在10亿之间,但您不能保证所有实现都会做到这一点。根据标准和'()#t是正确的。实际上,两个示例可以有任何结果,报告也可以。请注意,如果#f胜过'test,我保证您将(eq? 10 10) ; ==> #f(eq? '(a) '(a)) ; ==> #t在一起,但反之则不然。如果某事是#t,您仍然不知道eqv?是什么。