generics - 为什么字符串和数字有单独的比较函数/运算符?

标签 generics polymorphism scheme operators lisp

我正在通过阅读在线教程慢慢学习 Scheme 和修改 Haskell Write Yourself a Scheme in 48 Hours .我刚到this部分,向我们介绍了 Scheme 中的一些比较运算符。

("=", numBoolBinop (==)),
("<", numBoolBinop (<)),
(">", numBoolBinop (>)),
("/=", numBoolBinop (/=)),
(">=", numBoolBinop (>=)),
("<=", numBoolBinop (<=)),
("&&", boolBoolBinop (&&)),
("||", boolBoolBinop (||)),
("string=?", strBoolBinop (==)),
("string<?", strBoolBinop (<)),
("string>?", strBoolBinop (>)),
("string<=?", strBoolBinop (<=)),
("string>=?", strBoolBinop (>=)),

我有几个新手问题。 1. 为什么不同类型有单独的比较运算符,而不是一个泛型运算符或一个有很多重载的运算符? 2. 是否有可能有一个适用于所有类型的“通用”相等运算符,它是如何实现的?如果不是所有类型,那么至少是字符串和数字?

最佳答案

只回答第二个问题:不,不是。首先,eq? 与任何其他相等谓词之间存在差异,并且 eq? 几乎不可避免地对数字具有不可靠的行为。所以您至少需要 eq? 和一个“语义”相等谓词。但是这样的语义相等谓词是不存在的,因为语言不知道你想要什么语义。例如,这应该返回什么?

(let ([c (cons #f #f)])
  (let ([a (cons c c)]
        [b (cons (cons #f #f) (cons #f #f))])
    (general-semantic-equal? a b)))

嗯,它应该返回 true 还是 false 取决于在程序中是否重要 a 的 car 和 cdr 是 eq? 而那些 b 则不是。如果不知道程序在做什么,就无法回答这个问题:相等谓词依赖于应用程序,该语言能做的最好的事情就是提供一个工具包,让您可以构建一个。

关于generics - 为什么字符串和数字有单独的比较函数/运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40079083/

相关文章:

c# - 泛型中的 <out T> 与 <T>

Scala Play框架2.1派生类

c# - 泛型与接口(interface)的实际优势

Clojure 对比其他 Lisp

java - java.lang.Object 的泛型不能转换为 [Ljava.lang.Object

Java 泛型 API 架构

generics - "Overflow evaluating the requirement"但这种递归根本不应该发生

c++ - 用模板函数覆盖虚函数

vector - 如何从 Racket 中的向量中获取最小整数

scheme - 方案/内存中的数组